Разработка сайтов

Чистка сообщений Б24 Коробка

Скрипт для чистки сообщений в корп портале Б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"); ?>


Подписка на блог Подпишись на новые материалы от US STUDIO и вы не пропустите интересные статьи от нашей компании