Skip to content

Commit ad888db

Browse files
committed
Added IMDB plugin
1 parent abc119f commit ad888db

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

Diff for: cli/run.php

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Room11\Jeeves\Chat\Plugin\Wikipedia as WikipediaPlugin;
1616
use Room11\Jeeves\Chat\Plugin\SwordFight as SwordFightPlugin;
1717
use Room11\Jeeves\Chat\Plugin\Docs as DocsPlugin;
18+
use Room11\Jeeves\Chat\Plugin\Imdb as ImdbPlugin;
1819

1920
use Room11\Jeeves\Chat\Client\Xhr as ChatClient;
2021

@@ -41,6 +42,7 @@
4142
->register(new WikipediaPlugin($chatClient))
4243
->register(new SwordFightPlugin($chatClient))
4344
->register(new DocsPlugin($chatClient))
45+
->register(new ImdbPlugin($chatClient))
4446
;
4547

4648
$webSocketUrl = $openIdClient->getWebSocketUri($roomId);

Diff for: src/Chat/Plugin/Imdb.php

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace Room11\Jeeves\Chat\Plugin;
4+
5+
use Room11\Jeeves\Chat\Client\Xhr as ChatClient;
6+
use Room11\Jeeves\Chat\Command\Message;
7+
use Amp\Artax\Response;
8+
9+
class Imdb implements Plugin
10+
{
11+
const COMMAND = 'imdb';
12+
13+
private $chatClient;
14+
15+
public function __construct(ChatClient $chatClient)
16+
{
17+
$this->chatClient = $chatClient;
18+
}
19+
20+
public function handle(Message $message): \Generator
21+
{
22+
if (!$this->validMessage($message)) {
23+
return;
24+
}
25+
26+
yield from $this->getResult($message);
27+
}
28+
29+
private function validMessage(Message $message): bool
30+
{
31+
return get_class($message) === 'Room11\Jeeves\Chat\Command\Command'
32+
&& $message->getCommand() === self::COMMAND
33+
&& $message->getParameters();
34+
}
35+
36+
private function getResult(Message $message): \Generator
37+
{
38+
$response = yield from $this->chatClient->request(
39+
'http://www.imdb.com/xml/find?xml=1&nr=1&tt=on&q=' . rawurlencode(implode(' ', $message->getParameters()))
40+
);
41+
42+
yield from $this->chatClient->postMessage(
43+
$this->getMessage($response)
44+
);
45+
}
46+
47+
private function getMessage(Response $response): string
48+
{
49+
$internalErrors = libxml_use_internal_errors(true);
50+
51+
$dom = new \DOMDocument();
52+
$dom->loadHTML($response->getBody());
53+
54+
libxml_use_internal_errors($internalErrors);
55+
56+
if ($dom->getElementsByTagName('resultset')->length === 0) {
57+
return 'I cannot find that title.';
58+
}
59+
60+
$result = $dom->getElementsByTagName('imdbentity')->item(0);
61+
62+
return sprintf(
63+
'[ [%s](%s) ] %s',
64+
$result->firstChild->wholeText,
65+
'http://www.imdb.com/title/' . $result->getAttribute('id'),
66+
$result->getElementsByTagName('description')->item(0)->textContent
67+
);
68+
}
69+
}

0 commit comments

Comments
 (0)