PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.34.2
MailPoet – Newsletters, Email Marketing, and Automation v5.34.2
5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / lib / Util / License / Features / Subscribers.php
mailpoet / lib / Util / License / Features Last commit date
Data 2 years ago CapabilitiesManager.php 2 months ago Subscribers.php 2 months ago index.php 3 years ago
Subscribers.php
192 lines
1 <?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
2
3 namespace MailPoet\Util\License\Features;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Services\Bridge;
9 use MailPoet\Settings\SettingsController;
10 use MailPoet\Subscribers\SubscribersRepository;
11 use MailPoet\WP\Functions as WPFunctions;
12
13 class Subscribers {
14 const SUBSCRIBERS_OLD_LIMIT = 2000;
15 const SUBSCRIBERS_NEW_LIMIT = 1000;
16 const NEW_LIMIT_DATE = '2019-11-00';
17 const MSS_KEY_STATE = 'mta.mailpoet_api_key_state.state';
18 const MSS_SUBSCRIBERS_LIMIT_SETTING_KEY = 'mta.mailpoet_api_key_state.data.site_active_subscriber_limit';
19 const MSS_SUPPORT_SETTING_KEY = 'mta.mailpoet_api_key_state.data.support_tier';
20 const PREMIUM_KEY_STATE = 'premium.premium_key_state.state';
21 const PREMIUM_SUBSCRIBERS_LIMIT_SETTING_KEY = 'premium.premium_key_state.data.site_active_subscriber_limit';
22 const MSS_EMAIL_VOLUME_LIMIT_SETTING_KEY = 'mta.mailpoet_api_key_state.data.email_volume_limit';
23 const MSS_EMAILS_SENT_SETTING_KEY = 'mta.mailpoet_api_key_state.data.emails_sent';
24 const PREMIUM_SUPPORT_SETTING_KEY = 'premium.premium_key_state.data.support_tier';
25 const SUBSCRIBERS_COUNT_CACHE_KEY = 'mailpoet_subscribers_count';
26 const SUBSCRIBERS_COUNT_CACHE_EXPIRATION_MINUTES = 60;
27 const SUBSCRIBERS_COUNT_CACHE_MIN_VALUE = 2000;
28
29 /** @var SettingsController */
30 private $settings;
31
32 /** @var SubscribersRepository */
33 private $subscribersRepository;
34
35 /** @var WPFunctions */
36 private $wp;
37
38 public function __construct(
39 SettingsController $settings,
40 SubscribersRepository $subscribersRepository,
41 WPFunctions $wp
42 ) {
43 $this->settings = $settings;
44 $this->subscribersRepository = $subscribersRepository;
45 $this->wp = $wp;
46 }
47
48 /**
49 * Checks if the subscribers limit is reached
50 * @return bool True if subscribers limit reached or restriction set, false otherwise
51 */
52 public function check(): bool {
53 $limit = $this->getSubscribersLimit();
54 $subscribersCount = $this->getSubscribersCount();
55 if ($limit && $subscribersCount > $limit) {
56 return true;
57 }
58 // We don't have data from MSS, or they might be outdated so we need to check accessibility restrictions
59 $mssStateData = $this->settings->get(Bridge::API_KEY_STATE_SETTING_NAME);
60 $restriction = $mssStateData['access_restriction'] ?? '';
61 return $restriction === Bridge::KEY_ACCESS_SUBSCRIBERS_LIMIT;
62 }
63
64 public function checkEmailVolumeLimitIsReached(): bool {
65 // We have data from MSS and we can determine based on the data
66 $emailVolumeLimit = $this->getEmailVolumeLimit();
67 $emailsSent = $this->getEmailsSent();
68 if ($emailVolumeLimit && $emailsSent > $emailVolumeLimit) {
69 return true;
70 }
71 // We don't have data from MSS, or they might be outdated so we need to check accessibility restrictions
72 $mssStateData = $this->settings->get(Bridge::API_KEY_STATE_SETTING_NAME);
73 $restriction = $mssStateData['access_restriction'] ?? '';
74 return $restriction === Bridge::KEY_ACCESS_EMAIL_VOLUME_LIMIT;
75 }
76
77 public function getSubscribersCount(): int {
78 $count = $this->wp->getTransient(self::SUBSCRIBERS_COUNT_CACHE_KEY);
79 if (is_numeric($count)) {
80 return (int)$count;
81 }
82 $count = $this->subscribersRepository->getTotalSubscribers();
83
84 // cache only when number of subscribers exceeds minimum value
85 if ($this->isSubscribersCountEnoughForCache($count)) {
86 $this->wp->setTransient(self::SUBSCRIBERS_COUNT_CACHE_KEY, $count, self::SUBSCRIBERS_COUNT_CACHE_EXPIRATION_MINUTES * 60);
87 }
88 return $count;
89 }
90
91 public function getFreshSubscribersCount(): int {
92 return $this->subscribersRepository->getTotalSubscribers();
93 }
94
95 public function getSubscriberLimitForNotifications(): ?int {
96 $limit = $this->getSubscribersLimit();
97 if (!is_numeric($limit)) {
98 return null;
99 }
100
101 $limit = (int)$limit;
102 return $limit > 0 ? $limit : null;
103 }
104
105 public function isSubscribersCountEnoughForCache(?int $count = null): bool {
106 if (is_null($count) && func_num_args() === 0) {
107 $count = $this->getSubscribersCount();
108 }
109 return $count > self::SUBSCRIBERS_COUNT_CACHE_MIN_VALUE;
110 }
111
112 /**
113 * Returns true if key is valid or valid but underprivileged
114 * Do not use the method to check if key is valid for sending emails or premium
115 * This only means that the Bridge can authenticate the key.
116 * @return bool
117 */
118 public function hasValidApiKey(): bool {
119 $mssState = $this->settings->get(self::MSS_KEY_STATE);
120 $premiumState = $this->settings->get(self::PREMIUM_KEY_STATE);
121 return $this->hasValidMssKey()
122 || $this->hasValidPremiumKey()
123 || $mssState === Bridge::KEY_VALID_UNDERPRIVILEGED
124 || $premiumState === Bridge::KEY_VALID_UNDERPRIVILEGED;
125 }
126
127 public function getSubscribersLimit() {
128 if (!$this->hasValidApiKey()) {
129 return $this->getFreeSubscribersLimit();
130 }
131 $mssState = $this->settings->get(self::MSS_KEY_STATE);
132 if (($this->hasValidMssKey() || $mssState === Bridge::KEY_VALID_UNDERPRIVILEGED) && $this->hasMssSubscribersLimit()) {
133 return $this->getMssSubscribersLimit();
134 }
135
136 $premiumState = $this->settings->get(self::PREMIUM_KEY_STATE);
137 if (($this->hasValidPremiumKey() || $premiumState === Bridge::KEY_VALID_UNDERPRIVILEGED) && $this->hasPremiumSubscribersLimit()) {
138 return $this->getPremiumSubscribersLimit();
139 }
140
141 return false;
142 }
143
144 public function getEmailVolumeLimit(): int {
145 return (int)$this->settings->get(self::MSS_EMAIL_VOLUME_LIMIT_SETTING_KEY);
146 }
147
148 public function getEmailsSent(): int {
149 return (int)$this->settings->get(self::MSS_EMAILS_SENT_SETTING_KEY);
150 }
151
152 public function hasValidMssKey() {
153 $state = $this->settings->get(self::MSS_KEY_STATE);
154 return $state === Bridge::KEY_VALID || $state === Bridge::KEY_EXPIRING;
155 }
156
157 private function hasMssSubscribersLimit() {
158 return !empty($this->settings->get(self::MSS_SUBSCRIBERS_LIMIT_SETTING_KEY));
159 }
160
161 private function getMssSubscribersLimit() {
162 return (int)$this->settings->get(self::MSS_SUBSCRIBERS_LIMIT_SETTING_KEY);
163 }
164
165 public function hasMssPremiumSupport() {
166 return $this->hasValidMssKey() && $this->settings->get(self::MSS_SUPPORT_SETTING_KEY) === 'premium';
167 }
168
169 public function hasValidPremiumKey() {
170 $state = $this->settings->get(self::PREMIUM_KEY_STATE);
171 return $state === Bridge::KEY_VALID || $state === Bridge::KEY_EXPIRING;
172 }
173
174 private function hasPremiumSubscribersLimit() {
175 return !empty($this->settings->get(self::PREMIUM_SUBSCRIBERS_LIMIT_SETTING_KEY));
176 }
177
178 private function getPremiumSubscribersLimit() {
179 return (int)$this->settings->get(self::PREMIUM_SUBSCRIBERS_LIMIT_SETTING_KEY);
180 }
181
182 public function hasPremiumSupport() {
183 return $this->hasValidPremiumKey() && $this->settings->get(self::PREMIUM_SUPPORT_SETTING_KEY) === 'premium';
184 }
185
186 private function getFreeSubscribersLimit() {
187 $installationTime = strtotime((string)$this->settings->get('installed_at'));
188 $oldUser = $installationTime < strtotime(self::NEW_LIMIT_DATE);
189 return $oldUser ? self::SUBSCRIBERS_OLD_LIMIT : self::SUBSCRIBERS_NEW_LIMIT;
190 }
191 }
192