Joywork/engine/classes/RocketChat.php
2026-05-22 21:21:54 +03:00

478 lines
18 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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;
}
}