PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.1.4
Independent Analytics – WordPress Analytics Plugin v2.1.4
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
CSV.php 2 years ago Currency.php 3 years ago Device.php 2 years ago Dir.php 2 years ago Number_Formatter.php 3 years ago Request.php 2 years ago Salt.php 2 years ago Security.php 2 years ago Singleton.php 3 years ago String_Util.php 3 years ago URL.php 3 years ago WP_Async_Request.php 2 years ago WordPress_Site_Date_Format_Pattern.php 3 years ago
Device.php
123 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(\IAWP_SCOPED\iawp_temp_path_to('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 public function type_id() : ?int
41 {
42 if (!\is_string($this->type) || $this->type === '') {
43 return null;
44 }
45 $device_types_table = Query::get_table_name(Query::DEVICE_TYPES);
46 $id = Illuminate_Builder::get_builder()->select('device_type_id')->from($device_types_table)->where('device_type', '=', $this->type)->value('device_type_id');
47 if (\is_null($id)) {
48 $id = Illuminate_Builder::get_builder()->from($device_types_table)->insertGetId(['device_type' => $this->type], 'device_type_id');
49 }
50 return $id;
51 }
52 public function os_id() : ?int
53 {
54 if (!\is_string($this->os) || $this->os === '') {
55 return null;
56 }
57 $device_oss_table = Query::get_table_name(Query::DEVICE_OSS);
58 $id = Illuminate_Builder::get_builder()->select('device_os_id')->from($device_oss_table)->where('device_os', '=', $this->os)->value('device_os_id');
59 if (\is_null($id)) {
60 $id = Illuminate_Builder::get_builder()->from($device_oss_table)->insertGetId(['device_os' => $this->os], 'device_os_id');
61 }
62 return $id;
63 }
64 public function browser_id() : ?int
65 {
66 if (!\is_string($this->browser) || $this->browser === '') {
67 return null;
68 }
69 $device_browsers_table = Query::get_table_name(Query::DEVICE_BROWSERS);
70 $id = Illuminate_Builder::get_builder()->select('device_browser_id')->from($device_browsers_table)->where('device_browser', '=', $this->browser)->value('device_browser_id');
71 if (\is_null($id)) {
72 $id = Illuminate_Builder::get_builder()->from($device_browsers_table)->insertGetId(['device_browser' => $this->browser], 'device_browser_id');
73 }
74 return $id;
75 }
76 public function is_bot() : bool
77 {
78 return $this->detector->isBot();
79 }
80 private function detect_os(DeviceDetector $detector) : ?string
81 {
82 $os = $detector->getOs('name');
83 if ($os === "UNK") {
84 return null;
85 }
86 return $os;
87 }
88 private function detect_type(DeviceDetector $detector) : ?string
89 {
90 $detected_type = $detector->getDeviceName();
91 $type_mapping = ['Mobile' => ['smartphone', 'phablet'], 'Tablet' => ['tablet'], 'Desktop' => ['desktop'], 'Car' => ['car browser'], 'Console' => ['console'], 'TV' => ['tv'], 'Wearable' => ['wearable']];
92 foreach ($type_mapping as $type => $types) {
93 if (\in_array($detected_type, $types)) {
94 return $type;
95 }
96 }
97 return null;
98 }
99 private function detect_browser(DeviceDetector $detector) : ?string
100 {
101 $name = $detector->getClient('name');
102 if ($name === 'UNK' || \is_array($name)) {
103 return null;
104 }
105 if ($this->should_use_browser_name($name)) {
106 return $name;
107 }
108 return \ucwords(Browser::getBrowserFamily($name) ?? $name);
109 }
110 /**
111 * Should the browsers name be used instead of the browsers family name?
112 *
113 * @param string $name
114 *
115 * @return bool
116 */
117 private function should_use_browser_name(string $name) : bool
118 {
119 $exceptions = ['Microsoft Edge'];
120 return \in_array($name, $exceptions);
121 }
122 }
123