Completed
Push — master ( 9b13bd...485b2c )
by Maxence
01:40
created

Provider::parseActivityHeader()   B

Complexity

Conditions 4
Paths 3

Size

Total Lines 22
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 22
rs 8.9197
cc 4
eloc 12
nc 3
nop 2
1
<?php
2
3
4
namespace OCA\Mood\Activity;
5
6
use OCA\Circles\Api\v1\Circles;
7
use OCA\Circles\Model\Circle;
8
use OCA\Circles\Model\SharingFrame;
9
use OCP\Activity\IEvent;
10
use OCP\Activity\IManager;
11
use OCP\Activity\IProvider;
12
use OCP\IL10N;
13
use OCP\IURLGenerator;
14
15
class Provider implements IProvider {
16
17
	/** @var IL10N */
18
	protected $l10n;
19
20
	/** @var IURLGenerator */
21
	protected $url;
22
23
	/** @var IManager */
24
	protected $activityManager;
25
26
	public function __construct(IURLGenerator $url, IManager $activityManager, IL10N $l10n) {
27
		$this->url = $url;
28
		$this->activityManager = $activityManager;
29
		$this->l10n = $l10n;
30
	}
31
32
33
	/**
34
	 * @param string $lang
35
	 * @param IEvent $event
36
	 * @param IEvent|null $previousEvent
37
	 *
38
	 * @return IEvent
39
	 * @since 11.0.0
40
	 */
41
	public function parse($lang, IEvent $event, IEvent $previousEvent = null) {
42
43
		if ($event->getApp() !== 'mood') {
44
			throw new \InvalidArgumentException();
45
		}
46
47
		$event->setIcon(
48
			$this->url->getAbsoluteURL($this->url->imagePath('mood', 'mood_black.svg'))
49
		);
50
51
		switch ($event->getSubject()) {
52
			case 'mood_item':
53
				$this->parseMoodItem($event);
54
55
				return $event;
56
		}
57
58
		throw new \InvalidArgumentException();
59
	}
60
61
62
	/**
63
	 * @param IEvent $event
64
	 */
65
	private function parseMoodItem(IEvent &$event) {
66
		$params = $event->getSubjectParameters();
67
		if (!key_exists('share', $params)) {
68
			throw new \InvalidArgumentException();
69
		}
70
71
		$frame = SharingFrame::fromJSON($params['share']);
72
		if ($frame === null) {
73
			throw new \InvalidArgumentException();
74
		}
75
76
		$this->parseActivityHeader($event, $frame);
77
		$this->parseMoodPayload($event, $frame->getPayload());
78
	}
79
80
81
	/**
82
	 * @param IEvent $event
83
	 * @param $mood
84
	 */
85
	private function parseMoodPayload(IEvent &$event, $mood) {
86
87
		if (key_exists('website', $mood)) {
88
			$event->setRichMessage(
89
				$mood['text'] . '{opengraph}',
90
				['opengraph' => $this->generateOpenGraphParameter('_id_', $mood['website'])]
91
			);
92
		} else {
93
			$event->setRichMessage(htmlspecialchars($mood['text']));
94
		}
95
96
	}
97
98
99
	/**
100
	 * @param IEvent $event
101
	 * @param SharingFrame $frame
102
	 */
103
	private function parseActivityHeader(IEvent &$event, SharingFrame $frame) {
104
105
		$data = [
106
			'author'  => Circles::generateUserParameter($frame),
107
			'circles' => Circles::generateCircleParameter($frame)
108
		];
109
110
		if ($frame->getAuthor() === $this->activityManager->getCurrentUserId()
111
			&& $frame->getCloudId() === null
112
		) {
113
			$event->setRichSubject($this->l10n->t('You shared a mood with {circles}'), $data);
114
115
			return;
116
		}
117
118
		if ($frame->getCircleType() === Circle::CIRCLES_PERSONAL) {
119
			$event->setRichSubject($this->l10n->t('{author} shared a mood with you'), $data);
120
		} else {
121
			$event->setRichSubject($this->l10n->t('{author} shared a mood with {circles}'), $data);
122
		}
123
124
	}
125
126
127
	/**
128
	 * @param $id
129
	 * @param $website
130
	 *
131
	 * @return array
132
	 */
133
	private function generateOpenGraphParameter($id, $website) {
134
		return [
135
			'type'        => 'open-graph',
136
			'id'          => $id,
137
			'name'        => $website['title'],
138
			'description' => $website['description'],
139
			'website'     => $website['website'],
140
			'thumb'       => \OC::$server->getURLGenerator()
141
										 ->linkToRoute('mood.Tools.binFromExternalImage') . '?url='
142
							 . rawurlencode($website['thumb']),
143
			'link'        => $website['url']
144
		];
145
	}
146
147
148
}
149