1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
18:
19: namespace LINE\LINEBot\Event\Parser;
20:
21: use LINE\LINEBot\Event\MessageEvent;
22: use LINE\LINEBot\Exception\InvalidEventRequestException;
23: use LINE\LINEBot\Exception\InvalidSignatureException;
24: use LINE\LINEBot\Exception\UnknownEventTypeException;
25: use LINE\LINEBot\Exception\UnknownMessageTypeException;
26: use LINE\LINEBot\SignatureValidator;
27:
28: class EventRequestParser
29: {
30: private static $eventType2class = [
31: 'message' => 'LINE\LINEBot\Event\MessageEvent',
32: 'follow' => 'LINE\LINEBot\Event\FollowEvent',
33: 'unfollow' => 'LINE\LINEBot\Event\UnfollowEvent',
34: 'join' => 'LINE\LINEBot\Event\JoinEvent',
35: 'leave' => 'LINE\LINEBot\Event\LeaveEvent',
36: 'postback' => 'LINE\LINEBot\Event\PostbackEvent',
37: 'beacon' => 'LINE\LINEBot\Event\BeaconDetectionEvent',
38: ];
39:
40: private static $messageType2class = [
41: 'text' => 'LINE\LINEBot\Event\MessageEvent\TextMessage',
42: 'image' => 'LINE\LINEBot\Event\MessageEvent\ImageMessage',
43: 'video' => 'LINE\LINEBot\Event\MessageEvent\VideoMessage',
44: 'audio' => 'LINE\LINEBot\Event\MessageEvent\AudioMessage',
45: 'location' => 'LINE\LINEBot\Event\MessageEvent\LocationMessage',
46: 'sticker' => 'LINE\LINEBot\Event\MessageEvent\StickerMessage',
47: ];
48:
49: 50: 51: 52: 53: 54: 55: 56: 57:
58: public static function parseEventRequest($body, $channelSecret, $signature)
59: {
60: if (!isset($signature)) {
61: throw new InvalidSignatureException('Request does not contain signature');
62: }
63:
64: if (!SignatureValidator::validateSignature($body, $channelSecret, $signature)) {
65: throw new InvalidSignatureException('Invalid signature has given');
66: }
67:
68: $events = [];
69:
70: $parsedReq = json_decode($body, true);
71: if (!array_key_exists('events', $parsedReq)) {
72: throw new InvalidEventRequestException();
73: }
74:
75: foreach ($parsedReq['events'] as $eventData) {
76: $eventType = $eventData['type'];
77: $eventClass = self::$eventType2class[$eventType];
78: if (!isset($eventClass)) {
79: throw new UnknownEventTypeException('Unknown event type has come: ' . $eventType);
80: }
81:
82: if ($eventType === 'message') {
83: $events[] = self::parseMessageEvent($eventData);
84: continue;
85: }
86:
87: $events[] = new $eventClass($eventData);
88: }
89:
90: return $events;
91: }
92:
93: 94: 95: 96: 97:
98: private static function parseMessageEvent($eventData)
99: {
100: $messageType = $eventData['message']['type'];
101: $messageClass = self::$messageType2class[$messageType];
102: if (!isset($messageClass)) {
103: throw new UnknownMessageTypeException('Unknown message type has come: ' . $messageType);
104: }
105: return new $messageClass($eventData);
106: }
107: }
108: