PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.2.0
Independent Analytics – WordPress Analytics Plugin v2.2.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
CSV.php 2 years ago Currency.php 2 years ago Device.php 2 years ago Dir.php 2 years ago Number_Formatter.php 2 years ago Request.php 2 years ago Salt.php 2 years ago Security.php 2 years ago Singleton.php 2 years ago String_Util.php 2 years ago URL.php 2 years ago WP_Async_Request.php 2 years ago WordPress_Site_Date_Format_Pattern.php 2 years ago
Device.php
124 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 /** @internal */
13 class Device
14 {
15 use Singleton;
16 private $detector;
17 private $type;
18 private $os;
19 private $browser;
20 private function __construct()
21 {
22 $this->detector = new DeviceDetector($_SERVER['HTTP_USER_AGENT']);
23 // symphony/cache example
24 // $this->detector->setCache(
25 // new PSR6Bridge(
26 // new FilesystemAdapter('devices-cache', 0, trailingslashit(wp_upload_dir()['basedir']) . 'iawp-cache')
27 // )
28 // );
29 $this->detector->setCache(new DoctrineBridge(new PhpFileCache(\IAWP_SCOPED\iawp_temp_path_to('device-data-cache'))));
30 try {
31 @$this->detector->parse();
32 $this->type = $this->detect_type($this->detector);
33 $this->os = $this->detect_os($this->detector);
34 $this->browser = $this->detect_browser($this->detector);
35 } catch (Throwable $e) {
36 $this->type = null;
37 $this->os = null;
38 $this->browser = null;
39 }
40 }
41 public function type_id() : ?int
42 {
43 if (!\is_string($this->type) || $this->type === '') {
44 return null;
45 }
46 $device_types_table = Query::get_table_name(Query::DEVICE_TYPES);
47 $id = Illuminate_Builder::get_builder()->select('device_type_id')->from($device_types_table)->where('device_type', '=', $this->type)->value('device_type_id');
48 if (\is_null($id)) {
49 $id = Illuminate_Builder::get_builder()->from($device_types_table)->insertGetId(['device_type' => $this->type], 'device_type_id');
50 }
51 return $id;
52 }
53 public function os_id() : ?int
54 {
55 if (!\is_string($this->os) || $this->os === '') {
56 return null;
57 }
58 $device_oss_table = Query::get_table_name(Query::DEVICE_OSS);
59 $id = Illuminate_Builder::get_builder()->select('device_os_id')->from($device_oss_table)->where('device_os', '=', $this->os)->value('device_os_id');
60 if (\is_null($id)) {
61 $id = Illuminate_Builder::get_builder()->from($device_oss_table)->insertGetId(['device_os' => $this->os], 'device_os_id');
62 }
63 return $id;
64 }
65 public function browser_id() : ?int
66 {
67 if (!\is_string($this->browser) || $this->browser === '') {
68 return null;
69 }
70 $device_browsers_table = Query::get_table_name(Query::DEVICE_BROWSERS);
71 $id = Illuminate_Builder::get_builder()->select('device_browser_id')->from($device_browsers_table)->where('device_browser', '=', $this->browser)->value('device_browser_id');
72 if (\is_null($id)) {
73 $id = Illuminate_Builder::get_builder()->from($device_browsers_table)->insertGetId(['device_browser' => $this->browser], 'device_browser_id');
74 }
75 return $id;
76 }
77 public function is_bot() : bool
78 {
79 return $this->detector->isBot();
80 }
81 private function detect_os(DeviceDetector $detector) : ?string
82 {
83 $os = $detector->getOs('name');
84 if ($os === "UNK") {
85 return null;
86 }
87 return $os;
88 }
89 private function detect_type(DeviceDetector $detector) : ?string
90 {
91 $detected_type = $detector->getDeviceName();
92 $type_mapping = ['Mobile' => ['smartphone', 'phablet'], 'Tablet' => ['tablet'], 'Desktop' => ['desktop'], 'Car' => ['car browser'], 'Console' => ['console'], 'TV' => ['tv'], 'Wearable' => ['wearable']];
93 foreach ($type_mapping as $type => $types) {
94 if (\in_array($detected_type, $types)) {
95 return $type;
96 }
97 }
98 return null;
99 }
100 private function detect_browser(DeviceDetector $detector) : ?string
101 {
102 $name = $detector->getClient('name');
103 if ($name === 'UNK' || \is_array($name)) {
104 return null;
105 }
106 if ($this->should_use_browser_name($name)) {
107 return $name;
108 }
109 return \ucwords(Browser::getBrowserFamily($name) ?? $name);
110 }
111 /**
112 * Should the browsers name be used instead of the browsers family name?
113 *
114 * @param string $name
115 *
116 * @return bool
117 */
118 private function should_use_browser_name(string $name) : bool
119 {
120 $exceptions = ['Microsoft Edge'];
121 return \in_array($name, $exceptions);
122 }
123 }
124