PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 1.29.0
Independent Analytics – WordPress Analytics Plugin v1.29.0
2.15.5 2.15.4 2.15.3 2.15.2 2.15.1 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 3 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
105 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 class Device
12 {
13 use Singleton;
14 private $detector;
15 private $type;
16 private $os;
17 private $browser;
18 private function __construct()
19 {
20 $this->detector = new DeviceDetector($_SERVER['HTTP_USER_AGENT']);
21 // symphony/cache example
22 // $this->detector->setCache(
23 // new PSR6Bridge(
24 // new FilesystemAdapter('devices-cache', 0, trailingslashit(wp_upload_dir()['basedir']) . 'iawp-cache')
25 // )
26 // );
27 $this->detector->setCache(new DoctrineBridge(new PhpFileCache(\trailingslashit(\wp_upload_dir()['basedir']) . 'iawp/device-data-cache')));
28 $this->detector->parse();
29 $this->type = $this->detect_type($this->detector);
30 $this->os = $this->detect_os($this->detector);
31 $this->browser = $this->detect_browser($this->detector);
32 }
33 /*
34 * I'm still trying to decide if I want to keep the database structure as is, or break out the
35 * individual values into their own tables such as an oss table and a types device table.
36 *
37 * The pros to breaking it out would be faster queries that group by an id instead of a varchar
38 *
39 * The cons are bigger tables and more complex joins...
40 */
41 public function id() : ?int
42 {
43 if (!$this->has_device_details() || $this->is_bot()) {
44 return null;
45 }
46 $devices_table = Query::get_table_name(Query::DEVICES);
47 $device_id = Illuminate_Builder::get_builder()->from($devices_table)->where('type', $this->type)->where('os', $this->os)->where('browser', $this->browser)->value('device_id');
48 if (!\is_null($device_id)) {
49 return $device_id;
50 }
51 Illuminate_Builder::get_builder()->from($devices_table)->insertOrIgnore(['type' => $this->type, 'os' => $this->os, 'browser' => $this->browser]);
52 return Illuminate_Builder::get_builder()->from($devices_table)->where('type', $this->type)->where('os', $this->os)->where('browser', $this->browser)->value('device_id');
53 }
54 public function is_bot() : bool
55 {
56 return $this->detector->isBot();
57 }
58 private function has_device_details() : bool
59 {
60 return !\is_null($this->type) || !\is_null($this->os) || !\is_null($this->browser);
61 }
62 private function detect_os(DeviceDetector $detector) : ?string
63 {
64 $os = $detector->getOs('name');
65 if ($os === "UNK") {
66 return null;
67 }
68 return $os;
69 }
70 private function detect_type(DeviceDetector $detector) : ?string
71 {
72 $detected_type = $detector->getDeviceName();
73 $type_mapping = ['Mobile' => ['smartphone', 'phablet'], 'Tablet' => ['tablet'], 'Desktop' => ['desktop'], 'Car' => ['car browser'], 'Console' => ['console'], 'TV' => ['tv'], 'Wearable' => ['wearable']];
74 foreach ($type_mapping as $type => $types) {
75 if (\in_array($detected_type, $types)) {
76 return $type;
77 }
78 }
79 return null;
80 }
81 private function detect_browser(DeviceDetector $detector) : ?string
82 {
83 $name = $detector->getClient('name');
84 if ($name === 'UNK' || \is_array($name)) {
85 return null;
86 }
87 if ($this->should_use_browser_name($name)) {
88 return $name;
89 }
90 return \ucwords(Browser::getBrowserFamily($name) ?? $name);
91 }
92 /**
93 * Should the browsers name be used instead of the browsers family name?
94 *
95 * @param string $name
96 *
97 * @return bool
98 */
99 private function should_use_browser_name(string $name) : bool
100 {
101 $exceptions = ['Microsoft Edge'];
102 return \in_array($name, $exceptions);
103 }
104 }
105