This repository has been archived by the owner on Apr 7, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathclient.php
143 lines (126 loc) · 3.38 KB
/
client.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<?php
namespace SimpleChat;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class Chat implements MessageComponentInterface
{
/**
* Storage for connections
* @var \SplObjectStorage
*/
protected $clients;
/**
* Messages history storage
* @var array
*/
protected $lastMessages = [];
/**
* Count messages in storage
* @var int
*/
protected $countHistoryMessages = 10;
/**
* Storage for input and response data
* @var
*/
protected $data;
/**
* @return string
*/
public function getData(): string
{
return json_encode($this->data);
}
/**
* @param string $data
*/
public function setData(string $data): void
{
$this->data = json_decode($data);
}
/**
* Get last messages from history storage
* @return array
*/
public function getLastMessages(): array
{
return $this->lastMessages;
}
/**
* Add to history storage last message
* @param string $lastMessages
* @return void
*/
public function setLastMessages(string $lastMessages): void
{
$this->lastMessages[] = $lastMessages;
$this->lastMessages = array_slice($this->lastMessages, '-' . $this->countHistoryMessages);
}
/**
* Create connection storage
* Chat constructor.
*/
public function __construct()
{
$this->clients = new \SplObjectStorage;
}
/**
* Execute for create new connection
* @param ConnectionInterface $connection
* @return void
*/
public function onOpen(ConnectionInterface $connection): void
{
// Store the new connection to send messages to later
$this->clients->attach($connection);
$connection->send(json_encode(['last_messages' => $this->getLastMessages()]));
$this->consoleMessage('New connection! (' . $connection->resourceId . ') ');
}
/**
* @param ConnectionInterface $from
* @param string $message
* @return void
*/
public function onMessage(ConnectionInterface $from, $message): void
{
$this->setData($message);
$this->setLastMessages($message);
foreach ($this->clients as $client) {
//Don't send own
if ($from !== $client) {
$client->send($this->getData());
}
}
}
/**
* Execte when connection close, or if no message no longer
* @param ConnectionInterface $connection
* @return void
*/
public function onClose(ConnectionInterface $connection): void
{
// The connection is closed, remove it, as we can no longer send it messages
$this->clients->detach($connection);
$this->consoleMessage('Connection ' . $connection->resourceId . ' has disconnected');
}
/**
* Execute when was error
* @param ConnectionInterface $connection
* @param \Exception $e
* @return void
*/
public function onError(ConnectionInterface $connection, \Exception $e): void
{
$this->consoleMessage('An error has occured: ' . $e->getMessage());
$connection->close();
}
/**
* Write message to console for tracking proccess
* @param $message
* @return void
*/
public function consoleMessage(string $message): void
{
echo $message . PHP_EOL;
}
}