PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 1.30.0
Independent Analytics – WordPress Analytics Plugin v1.30.0
2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 1.19.1 1.2 1.20.0 1.21.0 1.22.0 1.22.1 1.23.0 1.23.1 1.24.0 1.24.1 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.28.1 1.28.2 1.28.3 1.29.0 1.3 1.30.0 1.30.1 1.4 1.5 1.6 1.7 1.8 1.9 2.0.0 2.0.1 2.1.4 2.1.5 2.1.6 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.10 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.11.8 2.11.9 2.12.0 2.12.1 2.12.2 2.13.1 2.13.2 2.13.5 2.13.6 2.14.0 2.14.1 2.14.2 2.14.4 2.14.6 2.14.7 2.14.8 2.14.9 2.2.0 2.2.1 2.3.1 2.3.2 2.4.2 2.4.3 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.7.1 2.7.2 2.7.3 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7
independent-analytics / IAWP / Utils / Device.php
independent-analytics / IAWP / Utils Last commit date
Array_To_CSV.php 3 years ago Currency.php 3 years ago Device.php 2 years ago Number_Formatter.php 3 years ago Option.php 2 years ago Request.php 2 years ago Salt.php 3 years ago Security.php 3 years ago Singleton.php 2 years ago String_Util.php 3 years ago URL.php 3 years ago WP_Async_Request.php 3 years ago WordPress_Site_Date_Format_Pattern.php 3 years ago
Device.php
112 lines
1 <?php
2
3 namespace IAWP_SCOPED\IAWP\Utils;
4
5 use IAWP_SCOPED\DeviceDetector\Cache\DoctrineBridge;
6 use IAWP_SCOPED\DeviceDetector\DeviceDetector;
7 use IAWP_SCOPED\DeviceDetector\Parser\Client\Browser;
8 use IAWP_SCOPED\Doctrine\Common\Cache\PhpFileCache;
9 use IAWP_SCOPED\IAWP\Illuminate_Builder;
10 use IAWP_SCOPED\IAWP\Query;
11 use Throwable;
12 class Device
13 {
14 use Singleton;
15 private $detector;
16 private $type;
17 private $os;
18 private $browser;
19 private function __construct()
20 {
21 $this->detector = new DeviceDetector($_SERVER['HTTP_USER_AGENT']);
22 // symphony/cache example
23 // $this->detector->setCache(
24 // new PSR6Bridge(
25 // new FilesystemAdapter('devices-cache', 0, trailingslashit(wp_upload_dir()['basedir']) . 'iawp-cache')
26 // )
27 // );
28 $this->detector->setCache(new DoctrineBridge(new PhpFileCache(\trailingslashit(\wp_upload_dir()['basedir']) . 'iawp/device-data-cache')));
29 try {
30 @$this->detector->parse();
31 $this->type = $this->detect_type($this->detector);
32 $this->os = $this->detect_os($this->detector);
33 $this->browser = $this->detect_browser($this->detector);
34 } catch (Throwable $e) {
35 $this->type = null;
36 $this->os = null;
37 $this->browser = null;
38 }
39 }
40 /*
41 * I'm still trying to decide if I want to keep the database structure as is, or break out the
42 * individual values into their own tables such as an oss table and a types device table.
43 *
44 * The pros to breaking it out would be faster queries that group by an id instead of a varchar
45 *
46 * The cons are bigger tables and more complex joins...
47 */
48 public function id() : ?int
49 {
50 if (!$this->has_device_details() || $this->is_bot()) {
51 return null;
52 }
53 $devices_table = Query::get_table_name(Query::DEVICES);
54 $device_id = Illuminate_Builder::get_builder()->from($devices_table)->where('type', $this->type)->where('os', $this->os)->where('browser', $this->browser)->value('device_id');
55 if (!\is_null($device_id)) {
56 return $device_id;
57 }
58 Illuminate_Builder::get_builder()->from($devices_table)->insertOrIgnore(['type' => $this->type, 'os' => $this->os, 'browser' => $this->browser]);
59 return Illuminate_Builder::get_builder()->from($devices_table)->where('type', $this->type)->where('os', $this->os)->where('browser', $this->browser)->value('device_id');
60 }
61 public function is_bot() : bool
62 {
63 return $this->detector->isBot();
64 }
65 private function has_device_details() : bool
66 {
67 return !\is_null($this->type) || !\is_null($this->os) || !\is_null($this->browser);
68 }
69 private function detect_os(DeviceDetector $detector) : ?string
70 {
71 $os = $detector->getOs('name');
72 if ($os === "UNK") {
73 return null;
74 }
75 return $os;
76 }
77 private function detect_type(DeviceDetector $detector) : ?string
78 {
79 $detected_type = $detector->getDeviceName();
80 $type_mapping = ['Mobile' => ['smartphone', 'phablet'], 'Tablet' => ['tablet'], 'Desktop' => ['desktop'], 'Car' => ['car browser'], 'Console' => ['console'], 'TV' => ['tv'], 'Wearable' => ['wearable']];
81 foreach ($type_mapping as $type => $types) {
82 if (\in_array($detected_type, $types)) {
83 return $type;
84 }
85 }
86 return null;
87 }
88 private function detect_browser(DeviceDetector $detector) : ?string
89 {
90 $name = $detector->getClient('name');
91 if ($name === 'UNK' || \is_array($name)) {
92 return null;
93 }
94 if ($this->should_use_browser_name($name)) {
95 return $name;
96 }
97 return \ucwords(Browser::getBrowserFamily($name) ?? $name);
98 }
99 /**
100 * Should the browsers name be used instead of the browsers family name?
101 *
102 * @param string $name
103 *
104 * @return bool
105 */
106 private function should_use_browser_name(string $name) : bool
107 {
108 $exceptions = ['Microsoft Edge'];
109 return \in_array($name, $exceptions);
110 }
111 }
112