PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.6.0
Independent Analytics – WordPress Analytics Plugin v2.6.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 / Models / Visitor.php
independent-analytics / IAWP / Models Last commit date
Campaign.php 2 years ago Current_Traffic.php 2 years ago Device.php 2 years ago Geo.php 2 years ago Page.php 2 years ago Page_Author_Archive.php 2 years ago Page_Date_Archive.php 2 years ago Page_Home.php 2 years ago Page_Not_Found.php 2 years ago Page_Post_Type_Archive.php 2 years ago Page_Search.php 2 years ago Page_Singular.php 2 years ago Page_Term_Archive.php 2 years ago Page_Virtual.php 2 years ago Referrer.php 2 years ago Universal_Model_Columns.php 2 years ago Visitor.php 2 years ago WooCommerce_Stats.php 2 years ago
Visitor.php
111 lines
1 <?php
2
3 namespace IAWP\Models;
4
5 use IAWP\Geoposition;
6 use IAWP\Illuminate_Builder;
7 use IAWP\Query;
8 use IAWP\Utils\Request;
9 use IAWP\Utils\Salt;
10 /**
11 * How to use:
12 *
13 * Example IP from the Netherlands
14 * $visitor = new Visitor('92.111.145.208', 'some ua string');
15 *
16 * Example IP from the United States
17 * $visitor = new Visitor('98.111.145.208', 'some ua string');
18 *
19 * Access visitor token
20 * $visitor->id();
21 * @internal
22 */
23 class Visitor
24 {
25 private $id;
26 private $geoposition;
27 private $current_session;
28 /**
29 * New instances should be created with a string ip address
30 *
31 * @param string $ip
32 * @param string $user_agent
33 */
34 public function __construct(string $ip, string $user_agent)
35 {
36 $this->id = $this->fetch_visitor_id($this->calculate_hash($ip, $user_agent));
37 $this->geoposition = new Geoposition($ip);
38 $this->current_session = $this->fetch_current_session();
39 }
40 public function geoposition() : Geoposition
41 {
42 return $this->geoposition;
43 }
44 public function has_recorded_session() : bool
45 {
46 return \is_object($this->current_session);
47 }
48 public function most_recent_session_id() : ?int
49 {
50 if ($this->has_recorded_session() && \is_int($this->current_session->session_id)) {
51 return $this->current_session->session_id;
52 } else {
53 return null;
54 }
55 }
56 public function most_recent_initial_view_id() : ?int
57 {
58 if ($this->has_recorded_session() && \is_int($this->current_session->initial_view_id)) {
59 return $this->current_session->initial_view_id;
60 } else {
61 return null;
62 }
63 }
64 public function most_recent_view_id() : ?int
65 {
66 if (!$this->has_recorded_session()) {
67 return null;
68 }
69 if (\is_int($this->current_session->final_view_id)) {
70 return $this->current_session->final_view_id;
71 }
72 return $this->current_session->initial_view_id;
73 }
74 /**
75 * Return the database id for a visitor
76 *
77 * @return string
78 */
79 public function id() : string
80 {
81 return $this->id;
82 }
83 /**
84 * @param string $ip
85 * @param string $user_agent
86 * @return string
87 */
88 private function calculate_hash(string $ip, string $user_agent) : string
89 {
90 $salt = Salt::visitor_token_salt();
91 $result = $salt . $ip . $user_agent;
92 return \md5($result);
93 }
94 private function fetch_visitor_id(string $hash) : int
95 {
96 $visitors_table = Query::get_table_name(Query::VISITORS);
97 Illuminate_Builder::get_builder()->from($visitors_table)->insertOrIgnore([['hash' => $hash]]);
98 return Illuminate_Builder::get_builder()->from($visitors_table)->where('hash', '=', $hash)->value('visitor_id');
99 }
100 private function fetch_current_session()
101 {
102 $sessions_table = Query::get_table_name(Query::SESSIONS);
103 $session = Illuminate_Builder::get_builder()->from($sessions_table, 'sessions')->selectRaw('IFNULL(ended_at, created_at) AS latest_view_at')->selectRaw('sessions.*')->where('visitor_id', '=', $this->id)->havingRaw('latest_view_at > DATE_SUB(UTC_TIMESTAMP(), INTERVAL 30 MINUTE)')->orderBy('latest_view_at', 'DESC')->first();
104 return $session;
105 }
106 public static function fetch_current_visitor() : self
107 {
108 return new \IAWP\Models\Visitor(Request::ip(), Request::user_agent());
109 }
110 }
111