From 9a197b2e468dc2e0645e07de878eab53d0f46b13 Mon Sep 17 00:00:00 2001 From: Pieter Hordijk Date: Wed, 13 Jan 2016 00:03:17 +0100 Subject: [PATCH] Added urban dictionary command --- cli/run.php | 2 ++ src/Chat/Command/Urban.php | 70 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 src/Chat/Command/Urban.php diff --git a/cli/run.php b/cli/run.php index f03f6bc..06602d2 100644 --- a/cli/run.php +++ b/cli/run.php @@ -11,6 +11,7 @@ use Room11\Jeeves\Chat\Message\Factory as MessageFactory; use Room11\Jeeves\Chat\Command\Version as VersionCommand; +use Room11\Jeeves\Chat\Command\Urban as UrbanCommand; use Amp\Websocket\Handshake; use Room11\Jeeves\WebSocket\Handler; @@ -33,6 +34,7 @@ $commands = (new CommandCollection()) ->register(new VersionCommand($httpClient, $chatKey)) + ->register(new UrbanCommand($httpClient, $chatKey)) ; \Amp\run(function () use ($webSocketUrl, $httpClient, $chatKey, $roomCollection, $commands, $logger) { diff --git a/src/Chat/Command/Urban.php b/src/Chat/Command/Urban.php new file mode 100644 index 0000000..e5a48bf --- /dev/null +++ b/src/Chat/Command/Urban.php @@ -0,0 +1,70 @@ +httpClient = $httpClient; + $this->chatKey = $chatKey; + } + + public function handle(Message $message): \Generator + { + if (!$this->validMessage($message)) { + return; + } + + yield from $this->getResult($message); + } + + private function validMessage(Message $message): bool + { + return get_class($message) === 'Room11\Jeeves\Chat\Message\NewMessage' + && strpos($message->getContent(), '!!urban') === 0 + && count(explode(' ', trim($message->getContent())) > 1); + } + + private function getResult(Message $message): \Generator + { + $fullCommand = explode(' ', trim($message->getContent())); + + array_shift($fullCommand); + + $promise = $this->httpClient->request('http://api.urbandictionary.com/v0/define?term=' . implode('%20', $fullCommand)); + + $response = yield $promise; + + $result = json_decode($response->getBody(), true); + + yield from $this->postResult($message, $result); + } + + private function postResult(Message $message, array $result) + { + $body = (new FormBody) + ->addField('text', sprintf('[ [%s](%s) ] %s', $result['list'][0]['word'], $result['list'][0]['permalink'], str_replace('\r\n', "\r\n", $result['list'][0]['definition']))) + ->addField('fkey', $this->chatKey); + + $request = (new Request) + ->setUri('http://chat.stackoverflow.com/chats/' . $message->getRoomid() . '/messages/new') + ->setMethod('POST') + ->setBody($body); + + $promise = $this->httpClient->request($request); + + yield $promise; + } +}