Скрипт для чистки сообщений в корп портале Б24
Использованы не доккументированные классы:
MessageTable RecentTable ChatTable RelationTable
Они написаны уже на d7 поэтому работа ведется как с другими классами d7
<?
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php");
$APPLICATION->SetTitle("Чистка сообщений");
?>
<?
global $USER;
if (!$USER->IsAdmin()) header("Location: /");
use Bitrix\Im\Chat;
use Bitrix\Im\Model\ChatTable;
use Bitrix\Im\Model\MessageTable;
use Bitrix\Im\Model\RecentTable;
use Bitrix\Im\Model\RelationTable;
$rsUsers = CUser::GetList(($by = "personal_country"), ($order = "desc"), $filter);
while ($user = $rsUsers->fetch()) {
$arUser[$user['ID']] = $user;
}
$request = \Bitrix\Main\Context::getCurrent()->getRequest();
$clearall = $request->get("clearall");
$cleardialog = $request->get("cleardialog");
$onlychatsgroup = $request->get("onlychatsgroup");
$onlychats = $request->get("onlychats");
$clearfor = $request->get("clearfor");
$clearwithout = $request->get("clearwithout");
$cleardialogall = $request->get("cleardialogall");
?>
<script
src="https://code.jquery.com/jquery-3.3.1.js"
integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60="
crossorigin="anonymous"></script>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<form action="" method="post">
<div class="form-check" style="display: none;">
<label class="form-check-label">
<input type="checkbox" class="form-check-input" name="cleardialog" id="cleardialog">
чистить диалоги
</label>
</div>
<div class="form-group dialog" style="display: none;">
<label for="clearwithout">Чистить диалоги у всех кроме:</label>
<select multiple class="form-control" name="clearwithout[]" id="clearwithout">
<option value="">Не выбрано</option>
<? foreach ($arUser as $user): ?>
<option value="<?= $user['ID'] ?>" <?if(in_array($user['ID'],$clearwithout)) echo 'selected';?>><?= $user['NAME'] ?></option>
<? endforeach; ?>
</select>
</div>
<div class="form-group dialog" style="display: none;">
<label for="clearfor">Чистить диалоги только у:</label>
<select multiple class="form-control" name="clearfor[]" id="clearfor">
<option value="">Не выбрано</option>
<? foreach ($arUser as $user): ?>
<option value="<?= $user['ID'] ?>" <?if(in_array($user['ID'],$clearfor)) echo 'selected';?>><?= $user['NAME'] ?></option>
<? endforeach; ?>
</select>
</div>
<div class="form-check">
<label class="form-check-label">
<input type="checkbox" class="form-check-input" name="cleardialogall" id="cleardialogall" <?if($cleardialogall) echo 'checked';?>>
Чистить диалоги у всех
</label>
</div>
<div class="form-check">
<label class="form-check-label">
<input type="checkbox" class="form-check-input" name="onlychats" id="onlychats" <?if($onlychats) echo 'checked';?>>
Чистить только чаты (но сами группы чатов не удалять)
</label>
</div>
<div class="form-check">
<label class="form-check-label">
<input type="checkbox" class="form-check-input" name="onlychatsgroup" id="onlychatsgroup" <?if($onlychatsgroup) echo 'checked';?>>
Чистить только чаты (с удалением всех групп)
</label>
</div>
<div class="form-check">
<label class="form-check-label">
<input type="checkbox" class="form-check-input" name="clearall" id="clearall" <?if($clearall) echo 'checked';?>>
Очистка всего и сразу (чаты, диалоги, сообщения)
</label>
</div>
<br>
<input type="hidden" name="send" value="true">
<button type="submit" class="btn btn-primary">Очистить</button>
</form>
<script>
$('document').ready(function () {
$('.dialog').hide();
$('#clearfor').click(function () {
$('#clearwithout').val('');
if (!$('#cleardialog').prop('checked')) $('#cleardialog').click();
});
$('#clearwithout').click(function () {
$('#clearfor').val('');
if (!$('#cleardialog').prop('checked')) $('#cleardialog').click();
});
$('#cleardialog').click(function () {
if ($(this).prop('checked')){
$('.dialog').show();
}else{
$('.dialog').hide();
}
});
$('#cleardialogall').click(function () {
if ($(this).prop('checked')) {
$('#clearfor').val('');
$('#clearwithout').val('');
if ($('#cleardialog').prop('checked'))$('#cleardialog').click();
}
});
$('#onlychats').click(function () {
if ($(this).prop('checked') && $('#onlychatsgroup').prop('checked')) {
$('#onlychatsgroup').click();
}
})
$('#onlychatsgroup').click(function () {
if ($(this).prop('checked') && $('#onlychats').prop('checked')) {
$('#onlychats').click();
}
})
$('#clearall').click(function () {
if ($(this).prop('checked')) {
if ($('#onlychats').prop('checked')) {
$('#onlychats').click();
}
if ($('#onlychatsgroup').prop('checked')) {
$('#onlychatsgroup').click();
}
if ($('#cleardialog').prop('checked')) {
$('#cleardialog').click();
}
}
})
});
</script>
<style>
.form-check-label,.form-check-input{
cursor:pointer;
}
</style>
<?
$send = $request->get("send");
// код оставшийся от выбора конкретных сотрудников
if ($clearwithout || $clearfor) {
foreach ($arUser as $user) {
if ($clearwithout && !in_array($user['ID'], $clearwithout))
$arNewUser[$user['ID']] = $user;
if ($clearfor && in_array($user['ID'], $clearfor)) {
$arNewUser[$user['ID']] = $user;
}
}
$arUser = $arNewUser;
}
// сообщения
$messageDB = MessageTable::getList();
$arMessage = $messageDB->fetchAll();
// чаты
$chatDB = ChatTable::getList();
while ($chat = $chatDB->fetch()){
$arChat[$chat['ID']] = $chat;
}
// последние
$recentDB = RecentTable::getList();
$arRecent = $recentDB->fetchAll();
// связи
$relationDB = RelationTable::getList();
$arRelation = $relationDB->fetchAll();
$chatCount = 0;
$messageCount = 0;
if ($send) {
foreach ($arUser as $user) {
if ($cleardialog || $clearall || $cleardialogall) {
// пробегаем по сообщениям в диалогах
foreach ($arMessage as $message) {
if ($message['AUTHOR_ID'] == $user['ID'] && $arChat[$message['CHAT_ID']]['TYPE'] != 'C') {
$messageCount++;
MessageTable::delete($message['ID']);
}
}
// сносим диалоги
foreach ($arRelation as $rel) {
if ($rel['USER_ID'] == $user['ID'] && $rel['MESSAGE_TYPE'] == 'P') {
RelationTable::delete($rel['ID']);
}
}
foreach ($arRecent as $rec) {
// удаляем из последних чатов
if ($rec['USER_ID'] == $user['ID'] && $rec['ITEM_TYPE']=='P') {
$field = array(
'USER_ID' => $user['ID'],
);
//RecentTable::delete($field);
}
}
}
// пробегаем по чатам
if ($onlychats || $onlychatsgroup || $clearall) {
// пробегаем по сообщениям в чатах
foreach ($arMessage as $message) {
if ($message['AUTHOR_ID'] == $user['ID'] && $arChat[$message['CHAT_ID']]['TYPE'] == 'C' ) {
$messageCount++;
MessageTable::delete($message['ID']);
}
}
if ($onlychatsgroup || $clearall ) {
// Сносим чаты
foreach ($arRelation as $rel) {
if ($rel['USER_ID'] == $user['ID'] && $rel['MESSAGE_TYPE'] == 'C') {
$chatCount++;
RelationTable::delete($rel['ID']);
}
}
}
if($clearall){
// удаляем из последних и из связей
foreach ($arRelation as $rel) {
RelationTable::delete($rel['ID']);
}
foreach ($arRecent as $res){
$field = array(
'USER_ID' => $user['ID'],
);
RecentTable::delete($field);
}
}
}
}
echo '<br><b>Очищено:</b>';
echo '<br>Сообщений:' . $messageCount;
echo '<br>Диалогов:' . $chatCount;
echo '<br>Чатов:' . $chatCount;
}
?>
<?
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/footer.php"); ?>
|