Joywork/engine/classes/RocketChat.php

478 lines
18 KiB
PHP
Raw Normal View History

2026-05-22 20:21:54 +02:00
<?php
class RocketChat {
public static function getAgencyUserNames($agencyId) {
$sql = "SELECT u.id, s.chat_login, u.last_name, u.first_name, u.middle_name, u.user_logo FROM chat_settings_user s, users u
WHERE s.user_id = u.id and u.id in (SELECT us.id FROM users us WHERE us.id=$agencyId or us.id_manager=$agencyId or us.id_manager in (select usr.id from users usr where usr.id_manager=$agencyId) or us.id_manager in (select us.id from users us where us.id_manager in (select usrs.id from users usrs where usrs.id_manager=$agencyId))) ORDER BY u.last_name";
$result = mysql_query($sql);
$users = [];
if (mysql_num_rows($result) > 0) {
while ($usr = mysql_fetch_assoc($result)) {
$users[] = $usr;
}
}
return $users;
}
public static function getUserChatSettings($userId = 0) {
if (!$userId) {
$userId = $_SESSION['id'];
}
$sql = "SELECT * FROM `chat_settings_user` WHERE user_id = $userId";
$res = mysql_query($sql);
if (mysql_num_rows($res) > 0) {
return mysql_fetch_assoc($res);
} else {
return 0;
}
}
public static function getAgencyChatSettings($agencyId) {
$sql = "SELECT * FROM `chat_settings_agency` WHERE agency_id = $agencyId";
$res = mysql_query($sql);
if (mysql_num_rows($res) > 0) {
return mysql_fetch_assoc($res);
} else {
return 0;
}
}
public static function createUserChannel($userOwnerId, $name, $userIds) {
$url = RocketChat::getRocketChatUrl();
//логиним пользователя, если он не залогинен
$loginData = RocketChat::loginUser($userOwnerId);
$userChatUsernames = [];
foreach ($userIds as $id) {
$result = RocketChat::getUserChatSettings($id);
$userChatUsernames[] = $result['chat_login'];
}
return RocketChat::createChannel($name, $userChatUsernames, $url, $loginData['user']['chat_token'], $loginData['user']['chat_user_id']);
}
public static function getGroupUsers($groupId) {
$url = RocketChat::getRocketChatUrl();
//логиним пользователя, если он не залогинен
$loginData = RocketChat::loginUser($_SESSION['id']);
return RocketChat::getChannelMembers($groupId, $url, $loginData['user']['chat_token'], $loginData['user']['chat_user_id']);
}
public static function clearGroup($groupId) {
return RocketChat::clearRoomHistory($groupId);
}
public static function removeUserFromChannel($groupId, $userId) {
$url = RocketChat::getRocketChatUrl();
//логиним пользователя, если он не залогинен
$loginData = RocketChat::loginUser($_SESSION['id']);
return RocketChat::removeUserFromGroup($groupId, $userId, $url, $loginData['user']['chat_token'], $loginData['user']['chat_user_id']);
}
public static function createAgencyChannel($agencyId, $name) {
$url = RocketChat::getRocketChatUrl();
$adminToken = RocketChat::getAdminToken();
$adminUserId = RocketChat::getAdminUserId();
$agency = new User;
$agency->get($agencyId);
$managers = User::getAllManagers($agencyId, true);
$agents = User::getAllAgents($agencyId, true);
$userChatUsernames = [];
//создаем аккаунт для руководителя
$result = RocketChat::createChatUser($agency, $url, $adminToken, $adminUserId);
if ($result['success']) {
//создаем аккаунты для менеджеров
if ($managers) {
foreach ($managers as $mngr) {
$manager = new User;
$manager->get($mngr['id']);
$result = RocketChat::createChatUser($manager, $url, $adminToken, $adminUserId);
if ($result['success']) {
$userChatUsernames[] = $result['user']['chat_login'];
}
}
}
//создаем аккаунты для агентов
if ($agents) {
foreach ($agents as $agnt) {
$agent = new User;
$agent->get($agnt['id']);
$result = RocketChat::createChatUser($agent, $url, $adminToken, $adminUserId);
if ($result['success']) {
$userChatUsernames[] = $result['user']['chat_login'];
}
}
}
//логиним руководителя
$loginData = RocketChat::loginUser($agency->id);
//создаем канал
$channelSettings = RocketChat::getAgencyChatSettings($agency->id);
if ($channelSettings && $channelSettings['general_channel_id']) {
return ["success" => true, "settings" => $channelSettings, "error" => null];
} else {
$result = RocketChat::createChannel($name, $userChatUsernames, $url, $loginData['user']['chat_token'], $loginData['user']['chat_user_id']);
if ($result['success']) {
$id = $result['channelId'];
if ($channelSettings) {
$sql = "UPDATE `chat_settings_agency` SET general_channel_id = '$id' WHERE agency_id = $agency->id";
mysql_query($sql);
} else {
$sql = "INSERT INTO `chat_settings_agency`(agency_id, general_channel_id) VALUES($agency->id, '$id')";
mysql_query($sql);
}
$channelSettings = RocketChat::getAgencyChatSettings($agency->id);
return ["success" => true, "settings" => $channelSettings, "error" => null];
} else {
if ($channelSettings) {
$sql = "UPDATE `chat_settings_agency` SET error = '$result[error]' WHERE agency_id = $agency->id";
mysql_query($sql);
} else {
$sql = "INSERT INTO `chat_settings_agency`(agency_id, error) VALUES($agency->id, '$result[error]')";
mysql_query($sql);
}
return ["success" => false, "settings" => null, "error" => $result['error']];
}
}
} else {
return ["success" => false, "settings" => null, "error" => $result['error']];
}
}
public static function createChannel($name, $users, $baseUrl = '', $adminToken = '', $adminUserId = '') {
if (!$baseUrl) {
$baseUrl = RocketChat::getRocketChatUrl();
$adminToken = RocketChat::getAdminToken();
$adminUserId = RocketChat::getAdminUserId();
}
$url = $baseUrl . 'api/v1/channels.create';
$post = array(
'name' => $name,
'members' => $users
);
$header = array('Content-type:application/json',
'X-Auth-Token: ' . $adminToken, 'X-User-Id: ' . $adminUserId);
$resp = RocketChat::sendCurl($url, json_encode($post), $header);
$json = json_decode($resp, true);
if ($json['status'] === 'error') {
return ["success" => false, "channelId" => null, "error" => $json['message']];
}
if ($json['success']) {
return ["success" => true, "channelId" => $json['channel']['_id'], "error" => null];
} else {
return ["success" => false, "channelId" => null, "error" => $json['error']];
}
}
public static function loginUser($userId, $baseUrl = '') {
$settings = RocketChat::getUserChatSettings($userId);
if ($settings) {
if ($settings['chat_token'] && $settings['chat_user_id']) {
return ["success" => true, "user" => $settings, "error" => null];
} else {
if (!$baseUrl) {
$baseUrl = RocketChat::getRocketChatUrl();
}
$url = $baseUrl . 'api/v1/login';
$post = array(
'user' => $settings['chat_login'],
'password' => $settings['chat_password']
);
$header = array('Content-type:application/json');
$resp = RocketChat::sendCurl($url, json_encode($post), $header);
$json = json_decode($resp, true);
if ($json['status'] === 'success') {
$token = $json['data']['authToken'];
$chatUserId = $json['data']['userId'];
$sql = "UPDATE `chat_settings_user` SET chat_token = '$token', chat_user_id = '$chatUserId' WHERE user_id = $userId";
mysql_query($sql);
return ["success" => true, "user" => RocketChat::getUserChatSettings($userId), "error" => null];
} else {
$sql = "UPDATE `chat_settings_user` SET error = '$resp' WHERE user_id = $userId";
mysql_query($sql);
return ["success" => false, "user" => null, "error" => $json['error']];
}
}
} else {
return ["success" => false, "user" => null, "error" => "Не найден логин и пароль для авторизации"];
}
}
public static function deleteChatUser($userId, $baseUrl = '', $adminToken = '', $adminUserId = '') {
$settings = RocketChat::getUserChatSettings($userId);
if ($settings) {
if (!$baseUrl) {
$baseUrl = RocketChat::getRocketChatUrl();
$adminToken = RocketChat::getAdminToken();
$adminUserId = RocketChat::getAdminUserId();
}
$url = $baseUrl . 'api/v1/users.delete';
$post = array(
'username' => $settings['chat_login']
);
$header = array('Content-type:application/json',
'X-Auth-Token: ' . $adminToken, 'X-User-Id: ' . $adminUserId);
RocketChat::sendCurl($url, json_encode($post), $header);
}
}
public static function checkUserInChannel($user, $roomId, $baseUrl = '', $adminToken = '', $adminUserId = '') {
$settings = RocketChat::getUserChatSettings($user->id);
if ($settings && $settings['chat_user_id']) {
if (!$baseUrl) {
$baseUrl = RocketChat::getRocketChatUrl();
$adminToken = RocketChat::getAdminToken();
$adminUserId = RocketChat::getAdminUserId();
}
$url = $baseUrl . 'api/v1/users.info?userId=' . $settings['chat_user_id'] . '&fields={%22userRooms%22:%201}';
$header = array('Content-type:application/json',
'X-Auth-Token: ' . $adminToken, 'X-User-Id: ' . $adminUserId);
$resp = RocketChat::sendCurl($url, false, $header);
$json = json_decode($resp, true);
if ($json && $json['success'] == true) {
$rooms = $json['user']['rooms'];
if ($rooms) {
foreach ($rooms as $room) {
if ($room['rid'] === $roomId) {
return true;
}
}
}
}
}
return false;
}
public static function addUserToChannel($user, $roomId, $baseUrl = '', $adminToken = '', $adminUserId = '') {
$settings = RocketChat::getUserChatSettings($user->id);
if ($settings && $settings['chat_user_id']) {
if (!$baseUrl) {
$baseUrl = RocketChat::getRocketChatUrl();
$adminToken = RocketChat::getAdminToken();
$adminUserId = RocketChat::getAdminUserId();
}
$url = $baseUrl . 'api/v1/channels.invite';
$post = array(
'roomId' => $roomId,
'userId' => $settings['chat_user_id']
);
$header = array('Content-type:application/json',
'X-Auth-Token: ' . $adminToken, 'X-User-Id: ' . $adminUserId);
return RocketChat::sendCurl($url, json_encode($post), $header);
}
return 0;
}
public static function getChannelMembers($roomId, $baseUrl = '', $adminToken = '', $adminUserId = '') {
if (!$baseUrl) {
$baseUrl = RocketChat::getRocketChatUrl();
$adminToken = RocketChat::getAdminToken();
$adminUserId = RocketChat::getAdminUserId();
}
$url = $baseUrl . 'api/v1/channels.members?roomId='. $roomId;
$header = array('Content-type:application/json',
'X-Auth-Token: ' . $adminToken, 'X-User-Id: ' . $adminUserId);
return RocketChat::sendCurl($url, false, $header);
}
public static function clearRoomHistory($roomId, $baseUrl = '', $adminToken = '', $adminUserId = '') {
if (!$baseUrl) {
$baseUrl = RocketChat::getRocketChatUrl();
$adminToken = RocketChat::getAdminToken();
$adminUserId = RocketChat::getAdminUserId();
}
$url = $baseUrl . 'api/v1/rooms.cleanHistory';
$post = array(
'roomId' => $roomId,
'oldest' => '2010-09-30T13:42:25.304Z',
'latest' => '2050-09-30T13:42:25.304Z'
);
$header = array('Content-type:application/json',
'X-Auth-Token: ' . $adminToken, 'X-User-Id: ' . $adminUserId);
return RocketChat::sendCurl($url, json_encode($post), $header);
}
public static function removeUserFromGroup($roomId, $userId, $baseUrl = '', $adminToken = '', $adminUserId = '') {
if (!$baseUrl) {
$baseUrl = RocketChat::getRocketChatUrl();
$adminToken = RocketChat::getAdminToken();
$adminUserId = RocketChat::getAdminUserId();
}
$url = $baseUrl . 'api/v1/channels.kick';
$post = array(
'roomId' => $roomId,
'userId' => $userId
);
$header = array('Content-type:application/json',
'X-Auth-Token: ' . $adminToken, 'X-User-Id: ' . $adminUserId);
return RocketChat::sendCurl($url, json_encode($post), $header);
}
public static function createChatUser($user, $baseUrl = '', $adminToken = '', $adminUserId = '') {
$settings = RocketChat::getUserChatSettings($user->id);
if (!$settings || !$settings['chat_login']) {
if (!$baseUrl) {
$baseUrl = RocketChat::getRocketChatUrl();
$adminToken = RocketChat::getAdminToken();
$adminUserId = RocketChat::getAdminUserId();
}
$url = $baseUrl . 'api/v1/users.create';
$pass = generatePass();
$username = slugify($user->last_name) . '_' . slugify($user->first_name) . '_' . rand(1, 9);
$username = str_replace("ʹ", '', $username);
$post = array(
'email' => $user->email,
'name' => $user->last_name . ' ' . $user->first_name,
'password' => $pass,
'username' => $username,
'active' => true,
'roles' => ['user'],
'joinDefaultChannels' => false,
'requirePasswordChange' => false,
'sendWelcomeEmail' => false,
'verified' => false
);
$header = array('Content-type:application/json',
'X-Auth-Token: ' . $adminToken, 'X-User-Id: ' . $adminUserId);
$resp = RocketChat::sendCurl($url, json_encode($post), $header);
$json = json_decode($resp, true);
if ($json['success']) {
if ($settings) {
$sql = "UPDATE `chat_settings_user` SET chat_login = '$username', chat_password = '$pass' WHERE user_id = $user->id";
mysql_query($sql);
} else {
$sql = "INSERT INTO `chat_settings_user`(user_id, chat_login, chat_password) VALUES($user->id, '$username','$pass')";
mysql_query($sql);
}
return ["success" => true, "user" => RocketChat::getUserChatSettings($user->id), "error" => null];
} else {
if ($settings) {
$sql = "UPDATE `chat_settings_user` SET error = '$resp' WHERE user_id = $user->id";
mysql_query($sql);
} else {
$sql = "INSERT INTO `chat_settings_user`(user_id, error) VALUES($user->id, '$resp')";
mysql_query($sql);
}
return ["success" => false, "user" => null, "error" => $json['error']];
}
} else {
return ["success" => true, "user" => $settings, "error" => null];
}
}
public static function getAdminToken() {
$sql = "SELECT value FROM `params` WHERE code = 'rocket_chat_admin_token'";
$res = mysql_query($sql);
return mysql_fetch_assoc($res)['value'];
}
public static function getAdminUserId() {
$sql = "SELECT value FROM `params` WHERE code = 'rocket_chat_admin_user_id'";
$res = mysql_query($sql);
return mysql_fetch_assoc($res)['value'];
}
public static function getRocketChatUrl() {
$sql = "SELECT value FROM `params` WHERE code = 'rocket_chat_url'";
$res = mysql_query($sql);
return mysql_fetch_assoc($res)['value'];
}
private static function sendCurl($url, $post = false, $header = false){
$ch = curl_init($url);
//debug
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_STDERR, fopen($_SERVER['DOCUMENT_ROOT'] . '/curl.txt', 'a+'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if ($header) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_HEADER,0);
}
if ($post) {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
}
$response = curl_exec($ch);
//if(curl_error($ch)) {
//echo 'curl error is -' . curl_error($ch);
//}
curl_close($ch);
return $response;
}
}