24
24
25
25
use arkania \commands \parameters \Parameter ;
26
26
use arkania \commands \parameters \TextParameter ;
27
+ use arkania \lang \KnownTranslationsFactory ;
27
28
use InvalidArgumentException ;
28
29
use pocketmine \command \Command ;
29
30
use pocketmine \command \CommandSender ;
@@ -63,31 +64,37 @@ public function __construct(
63
64
abstract public function onRun (CommandSender $ sender , array $ parameters ) : void ;
64
65
abstract public function getCommandParameter () : array ;
65
66
66
- final public function execute (CommandSender $ sender , string $ commandLabel , array $ args ) : void {
67
- $ passArgs = [];
68
- if (count ($ args ) > 0 ) {
69
- if (isset ($ this ->subCommands [($ label = $ args [0 ])])) {
70
- $ cmd = $ this ->subCommands [$ label ];
71
- if (!$ cmd ->testPermissionSilent ($ sender )) {
72
- $ sender ->sendMessage (KnownTranslationFactory::commands_generic_permission ());
73
- return ;
74
- }
75
- $ cmd ->execute ($ sender , $ commandLabel , array_slice ($ args , 1 ));
76
- return ;
77
- }
78
- $ passArgs = $ this ->parseArguments ($ args , $ sender );
79
- } elseif (!empty ($ this ->parameters )) {
80
- $ sender ->sendMessage (KnownTranslationFactory::commands_generic_usage ($ this ->usageMessage ?? '/ ' . $ this ->getName ()));
81
- return ;
82
- }
83
- if ($ passArgs !== null ) {
84
- try {
85
- $ this ->onRun ($ sender , $ passArgs );
86
- } catch (InvalidCommandSyntaxException ) {
87
- $ sender ->sendMessage (KnownTranslationFactory::commands_generic_usage ($ this ->usageMessage ?? '/ ' . $ this ->getName ()));
88
- }
89
- }
90
- }
67
+ final public function execute (CommandSender $ sender , string $ commandLabel , array $ args ) : void {
68
+ $ passArgs = [];
69
+ if (count ($ args ) > 0 ) {
70
+ if (isset ($ this ->subCommands [($ label = $ args [0 ])])) {
71
+ $ cmd = $ this ->subCommands [$ label ];
72
+ if (!$ cmd ->testPermissionSilent ($ sender )) {
73
+ $ sender ->sendMessage (KnownTranslationFactory::commands_generic_permission ());
74
+ return ;
75
+ }
76
+ $ cmd ->execute ($ sender , $ commandLabel , array_slice ($ args , 1 ));
77
+ return ;
78
+ }
79
+ $ passArgs = $ this ->parseArguments ($ args , $ sender );
80
+ } elseif (!empty ($ this ->parameters )) {
81
+ foreach ($ this ->parameters as $ parameter ) {
82
+ if (!$ parameter [0 ]->isOptional ()) {
83
+ $ sender ->sendMessage (KnownTranslationFactory::commands_generic_usage ($ this ->usageMessage ?? '/ ' . $ this ->getName ()));
84
+ return ;
85
+ }
86
+ }
87
+ }
88
+ if ($ passArgs !== null ) {
89
+ try {
90
+ $ this ->onRun ($ sender , $ passArgs );
91
+ } catch (InvalidCommandSyntaxException $ e ) {
92
+ if (!$ e ->getParameter ()->isOptional ()) {
93
+ $ sender ->sendMessage (KnownTranslationFactory::commands_generic_usage ($ this ->usageMessage ?? '/ ' . $ this ->getName ()));
94
+ }
95
+ }
96
+ }
97
+ }
91
98
92
99
public function addParameter (int $ position , Parameter $ parameter ) : void {
93
100
if ($ position < 0 ) {
@@ -107,54 +114,57 @@ public function addParameter(int $position, Parameter $parameter) : void {
107
114
$ this ->parameters [$ position ][] = $ parameter ;
108
115
}
109
116
110
- private function parseArguments (array $ rawArgs , CommandSender $ sender ) : array {
111
- $ return = [];
112
- if (!!empty ($ this ->parameters ) && count ($ rawArgs ) > 0 ) {
113
- return $ return ;
114
- }
115
- $ offset = 0 ;
116
- if (count ($ rawArgs ) > 0 ) {
117
- foreach ($ this ->parameters as $ position => $ parameter ) {
118
- usort ($ parameter , function (Parameter $ a , Parameter $ b ) : int {
119
- if ($ a ->getSpanLength () === PHP_INT_MAX ) {
120
- return 1 ;
121
- }
117
+ private function parseArguments (array $ rawArgs , CommandSender $ sender ) : ? array {
118
+ $ return = [];
119
+ if (!!empty ($ this ->parameters ) && count ($ rawArgs ) > 0 ) {
120
+ return $ return ;
121
+ }
122
+ $ offset = 0 ;
123
+ if (count ($ rawArgs ) > 0 ) {
124
+ foreach ($ this ->parameters as $ position => $ parameter ) {
125
+ usort ($ parameter , function (Parameter $ a , Parameter $ b ) : int {
126
+ if ($ a ->getSpanLength () === PHP_INT_MAX ) {
127
+ return 1 ;
128
+ }
122
129
123
- return -1 ;
124
- });
125
- $ parsed = false ;
126
- $ optional = true ;
127
- foreach ($ parameter as $ param ) {
128
- $ p = trim (implode (" " , array_slice ($ rawArgs , $ offset , ($ len = $ param ->getSpanLength ()))));
129
- if (!$ param ->isOptional ()) {
130
- $ optional = false ;
131
- }
132
- if ($ p !== "" && $ param ->canParse ($ p , $ sender )) {
133
- $ k = $ param ->getName ();
134
- $ result = (clone $ param )->parse ($ p , $ sender );
135
- if (isset ($ return [$ k ]) && !is_array ($ return [$ k ])) {
136
- $ old = $ return [$ k ];
137
- unset($ return [$ k ]);
138
- $ return [$ k ] = [$ old ];
139
- $ return [$ k ][] = $ result ;
140
- } else {
141
- $ return [$ k ] = $ result ;
142
- }
143
- $ offset += $ len ;
144
- $ parsed = true ;
145
- break ;
146
- }
147
- if ($ offset > count ($ rawArgs )) {
148
- break ;
149
- }
150
- }
151
- if (!$ parsed && !($ optional && empty ($ arg ))) {
152
- return $ return ;
153
- }
154
- }
155
- }
156
- return $ return ;
157
- }
130
+ return -1 ;
131
+ });
132
+ $ parsed = false ;
133
+ $ optional = false ;
134
+ foreach ($ parameter as $ param ) {
135
+ $ p = trim (implode (" " , array_slice ($ rawArgs , $ offset , ($ len = $ param ->getSpanLength ()))));
136
+ if ($ param ->isOptional ()) {
137
+ $ optional = true ;
138
+ }
139
+ if ($ p !== "" && $ param ->canParse ($ p , $ sender )) {
140
+ $ k = $ param ->getName ();
141
+ $ result = (clone $ param )->parse ($ p , $ sender );
142
+ if (isset ($ return [$ k ]) && !is_array ($ return [$ k ])) {
143
+ $ old = $ return [$ k ];
144
+ unset($ return [$ k ]);
145
+ $ return [$ k ] = [$ old ];
146
+ $ return [$ k ][] = $ result ;
147
+ } else {
148
+ $ return [$ k ] = $ result ;
149
+ }
150
+ $ offset += $ len ;
151
+ $ parsed = true ;
152
+ break ;
153
+ } else if ($ param ->isOptional ()) {
154
+ $ parsed = true ;
155
+ break ;
156
+ } else {
157
+ $ sender ->sendMessage (KnownTranslationsFactory::command_argument_invalid ($ param ->getName ()));
158
+ return null ;
159
+ }
160
+ }
161
+ if (!$ parsed && !$ optional ) {
162
+ return $ return ;
163
+ }
164
+ }
165
+ }
166
+ return $ return ;
167
+ }
158
168
159
169
public function getParameters () : array {
160
170
return $ this ->parameters ;
0 commit comments