Quote values in .ini file
[shpub.git] / src / shpub / Cli.php
1 <?php
2 namespace shpub;
3
4 class Cli
5 {
6     /**
7      * @var Config
8      */
9     protected $cfg;
10
11     public function run()
12     {
13         $this->cfg = new Config();
14         $this->cfg->load();
15
16         try {
17             $optParser = $this->loadOptParser();
18             $res = $this->parseParameters($optParser);
19
20             switch ($res->command_name) {
21             case 'connect':
22                 $cmd = new Command_Connect($this->cfg);
23                 $cmd->run(
24                     $res->command->args['server'],
25                     $res->command->args['user'],
26                     $res->command->args['key'],
27                     $res->command->options['force']
28                 );
29                 break;
30
31             case 'server':
32                 $cmd = new Command_Server($this->cfg);
33                 $cmd->run($res->command->options['verbose']);
34                 break;
35
36             case 'like':
37                 $this->requireValidHost();
38                 $cmd = new Command_Like($this->cfg->host);
39                 $cmd->run($res->command->args['url']);
40                 break;
41
42             case 'reply':
43                 $this->requireValidHost();
44                 $cmd = new Command_Reply($this->cfg->host);
45                 $cmd->run(
46                     $res->command->args['url'],
47                     implode(' ', $res->command->args['text'])
48                 );
49                 break;
50
51             default:
52                 var_dump($this->cfg->host, $res);
53                 Log::err('FIXME');
54             }
55         } catch (\Exception $e) {
56             echo 'Error: ' . $e->getMessage() . "\n";
57             exit(1);
58         }
59     }
60
61     /**
62      * Let the CLI option parser parse the options.
63      *
64      * @param object $parser Option parser
65      *
66      * @return object Parsed command line parameters
67      */
68     protected function parseParameters(\Console_CommandLine $optParser)
69     {
70         try {
71             $res  = $optParser->parse();
72             $opts = $res->options;
73
74             $this->cfg->host = new Config_Host();
75             if ($opts['server'] !== null) {
76                 $key = $this->cfg->getHostByName($opts['server']);
77                 if ($key === null) {
78                     $this->cfg->host->server = $opts['server'];
79                 } else {
80                     $this->cfg->host = $this->cfg->hosts[$key];
81                 }
82             }
83             if ($opts['user'] !== null) {
84                 $this->cfg->host->user = $opts['user'];
85             }
86
87             return $res;
88         } catch (\Exception $exc) {
89             $optParser->displayError($exc->getMessage());
90         }
91     }
92
93     /**
94      * Load parameters for the CLI option parser.
95      *
96      * @return \Console_CommandLine CLI option parser
97      */
98     protected function loadOptParser()
99     {
100         $optParser = new \Console_CommandLine();
101         $optParser->description = 'shpub';
102         $optParser->version = '0.0.0';
103         $optParser->subcommand_required = true;
104
105         $optParser->addOption(
106             'server',
107             array(
108                 'short_name'  => '-s',
109                 'long_name'   => '--server',
110                 'description' => 'Server URL',
111                 'help_name'   => 'URL',
112                 'action'      => 'StoreString',
113                 'default'     => null,
114             )
115         );
116         $optParser->addOption(
117             'user',
118             array(
119                 'short_name'  => '-u',
120                 'long_name'   => '--user',
121                 'description' => 'User URL',
122                 'help_name'   => 'URL',
123                 'action'      => 'StoreString',
124                 'default'     => null,
125             )
126         );
127
128         $cmd = $optParser->addCommand('connect');
129         $cmd->addOption(
130             'force',
131             array(
132                 'short_name'  => '-f',
133                 'long_name'   => '--force-update',
134                 'description' => 'Force token update if token already available',
135                 'action'      => 'StoreTrue',
136                 'default'     => false,
137             )
138         );
139         $cmd->addArgument(
140             'server',
141             [
142                 'optional'    => false,
143                 'description' => 'Server URL',
144             ]
145         );
146         $cmd->addArgument(
147             'user',
148             [
149                 'optional'    => true,
150                 'description' => 'User URL',
151             ]
152         );
153         $cmd->addArgument(
154             'key',
155             [
156                 'optional'    => true,
157                 'description' => 'Short name (key)',
158             ]
159         );
160
161         $cmd = $optParser->addCommand('server');
162         $cmd->addOption(
163             'verbose',
164             array(
165                 'short_name'  => '-v',
166                 'long_name'   => '--verbose',
167                 'description' => 'Show more server infos',
168                 'action'      => 'StoreTrue',
169                 'default'     => false,
170             )
171         );
172
173         //$cmd = $optParser->addCommand('post');
174         $cmd = $optParser->addCommand('reply');
175         $cmd->addArgument(
176             'url',
177             [
178                 'optional'    => false,
179                 'description' => 'URL that is replied to',
180             ]
181         );
182         $cmd->addArgument(
183             'text',
184             [
185                 'optional'    => false,
186                 'multiple'    => true,
187                 'description' => 'Reply text',
188             ]
189         );
190
191         $cmd = $optParser->addCommand('like');
192         $cmd->addArgument(
193             'url',
194             [
195                 'optional'    => false,
196                 'description' => 'URL that is liked',
197             ]
198         );
199
200         return $optParser;
201     }
202
203     protected function requireValidHost()
204     {
205         if ($this->cfg->host->server === null
206             || $this->cfg->host->user === null
207             || $this->cfg->host->token === null
208         ) {
209             throw new \Exception(
210                 'Server data incomplete. "shpub connect" first.'
211             );
212         }
213
214         $this->cfg->host->loadEndpoints();
215     }
216 }
217 ?>