74 lines
2.3 KiB
PHP
74 lines
2.3 KiB
PHP
|
<?php
|
||
|
use Workerman\Worker;
|
||
|
use Workerman\WebServer;
|
||
|
use Workerman\Autoloader;
|
||
|
use PHPSocketIO\SocketIO;
|
||
|
|
||
|
// composer autoload
|
||
|
require_once join(DIRECTORY_SEPARATOR, array(__DIR__, "..", "..", "vendor", "autoload.php"));
|
||
|
|
||
|
$io = new SocketIO(2020);
|
||
|
$io->on('connection', function($socket){
|
||
|
$socket->addedUser = false;
|
||
|
// when the client emits 'new message', this listens and executes
|
||
|
$socket->on('new message', function ($data)use($socket){
|
||
|
// we tell the client to execute 'new message'
|
||
|
$socket->broadcast->emit('new message', array(
|
||
|
'username'=> $socket->username,
|
||
|
'message'=> $data
|
||
|
));
|
||
|
});
|
||
|
|
||
|
// when the client emits 'add user', this listens and executes
|
||
|
$socket->on('add user', function ($username) use($socket){
|
||
|
if ($socket->addedUser)
|
||
|
return;
|
||
|
global $usernames, $numUsers;
|
||
|
// we store the username in the socket session for this client
|
||
|
$socket->username = $username;
|
||
|
++$numUsers;
|
||
|
$socket->addedUser = true;
|
||
|
$socket->emit('login', array(
|
||
|
'numUsers' => $numUsers
|
||
|
));
|
||
|
// echo globally (all clients) that a person has connected
|
||
|
$socket->broadcast->emit('user joined', array(
|
||
|
'username' => $socket->username,
|
||
|
'numUsers' => $numUsers
|
||
|
));
|
||
|
});
|
||
|
|
||
|
// when the client emits 'typing', we broadcast it to others
|
||
|
$socket->on('typing', function () use($socket) {
|
||
|
$socket->broadcast->emit('typing', array(
|
||
|
'username' => $socket->username
|
||
|
));
|
||
|
});
|
||
|
|
||
|
// when the client emits 'stop typing', we broadcast it to others
|
||
|
$socket->on('stop typing', function () use($socket) {
|
||
|
$socket->broadcast->emit('stop typing', array(
|
||
|
'username' => $socket->username
|
||
|
));
|
||
|
});
|
||
|
|
||
|
// when the user disconnects.. perform this
|
||
|
$socket->on('disconnect', function () use($socket) {
|
||
|
global $usernames, $numUsers;
|
||
|
if($socket->addedUser) {
|
||
|
--$numUsers;
|
||
|
|
||
|
// echo globally that this client has left
|
||
|
$socket->broadcast->emit('user left', array(
|
||
|
'username' => $socket->username,
|
||
|
'numUsers' => $numUsers
|
||
|
));
|
||
|
}
|
||
|
});
|
||
|
|
||
|
});
|
||
|
|
||
|
if (!defined('GLOBAL_START')) {
|
||
|
Worker::runAll();
|
||
|
}
|