From 7606592ed89ab5e1c4b75ab9a6144eeefd6b5a94 Mon Sep 17 00:00:00 2001 From: lokses Date: Tue, 28 Jul 2026 21:15:29 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A7=D0=B0=D1=82:=20=D0=BC=D0=B5=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=C2=AB=D0=B1=D0=BE=D1=82=C2=BB=20=D1=83=20=D1=81=D0=BE?= =?UTF-8?q?=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=BE=D1=82=20?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Захватываем is_bot при резолве пользователей (/users/ids), рядом с именем отправителя показываем компактную подпись «бот». Также распознаём вебхуки (props.from_bot / from_webhook). Свои сообщения и обычных юзеров не помечаем. Co-Authored-By: Claude Opus 4.8 --- static/assets/js/chat.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/static/assets/js/chat.js b/static/assets/js/chat.js index 0816674..efc5823 100644 --- a/static/assets/js/chat.js +++ b/static/assets/js/chat.js @@ -10,6 +10,7 @@ var chatDmChannels = []; var chatDmLabels = {}; var chatTeamsById = {}; var chatUserNames = {}; +var chatUserIsBot = {}; // userId -> чи це бот (Mattermost is_bot) var chatPostsById = {}; var chatCurrentChannelId = null; var chatCurrentThreadRootId = null; @@ -67,6 +68,7 @@ function chatInit() { chatDmLabels = {}; chatTeamsById = {}; chatUserNames = {}; + chatUserIsBot = {}; chatPostsById = {}; chatCurrentChannelId = null; chatCurrentThreadRootId = null; @@ -172,6 +174,7 @@ function chatResolveUserIds(ids) { chatUserNames[u.id] = (u.first_name || u.last_name) ? (u.first_name + ' ' + u.last_name).trim() : u.username; + chatUserIsBot[u.id] = !!u.is_bot; }); }).catch(function (e) { console.error(e); }); } @@ -618,6 +621,19 @@ function chatRenderSearchResults(posts) { }); } +function chatPostIsBot(post) { + if (chatUserIsBot[post.user_id]) return true; + var p = post.props || {}; + return p.from_bot === 'true' || p.from_webhook === 'true'; +} + +function chatBotBadge() { + var b = document.createElement('span'); + b.textContent = 'бот'; + b.style.cssText = 'font-size:0.5625rem; font-weight:700; letter-spacing:0.03em; text-transform:uppercase; color:var(--color-muted-foreground); background:var(--color-muted); border:1px solid var(--color-border); border-radius:0.25rem; padding:0.0625rem 0.25rem; line-height:1.2;'; + return b; +} + function chatBuildMessageEl(post, context) { var isMine = post.user_id === chatConfig.currentUserId; var wrap = document.createElement('div'); @@ -643,6 +659,7 @@ function chatBuildMessageEl(post, context) { timeEl.style.cssText = 'font-size:0.6875rem; color:var(--color-muted-foreground);'; timeEl.textContent = post.create_at ? new Date(post.create_at).toLocaleTimeString([], {hour: '2-digit', minute: '2-digit'}) : ''; meta.appendChild(nameEl); + if (!isMine && chatPostIsBot(post)) meta.appendChild(chatBotBadge()); meta.appendChild(timeEl); body.appendChild(meta);