Merge pull request #2469 from Esalarc/group_chat_queue_display

Adding display of queued speakers in group chat windows.
This commit is contained in:
Cohee
2024-07-04 20:34:41 +03:00
committed by GitHub
5 changed files with 59 additions and 1 deletions

View File

@ -70,6 +70,7 @@ import {
animation_duration,
depth_prompt_role_default,
shouldAutoContinue,
this_chid,
} from '../script.js';
import { printTagList, createTagMapFromList, applyTagsOnCharacterSelect, tag_map, applyTagsOnGroupSelect } from './tags.js';
import { FILTER_TYPES, FilterHelper } from './filters.js';
@ -120,6 +121,8 @@ const DEFAULT_AUTO_MODE_DELAY = 5;
export const groupCandidatesFilter = new FilterHelper(debounce(printGroupCandidates, debounce_timeout.quick));
let autoModeWorker = null;
const saveGroupDebounced = debounce(async (group, reload) => await _save(group, reload), debounce_timeout.relaxed);
/** @type {Map<string, number>} */
let groupChatQueueOrder = new Map();
function setAutoModeWorker() {
clearInterval(autoModeWorker);
@ -857,7 +860,13 @@ async function generateGroupWrapper(by_auto_mode, type = null, params = {}) {
await saveChatConditional();
$('#send_textarea').val('')[0].dispatchEvent(new Event('input', { bubbles: true }));
}
groupChatQueueOrder = new Map();
if (power_user.show_group_chat_queue) {
for (let i = 0; i < activatedMembers.length; ++i) {
groupChatQueueOrder.set(characters[activatedMembers[i]].avatar, i + 1);
}
}
// now the real generation begins: cycle through every activated character
for (const chId of activatedMembers) {
throwIfAborted();
@ -865,6 +874,9 @@ async function generateGroupWrapper(by_auto_mode, type = null, params = {}) {
const generateType = type == 'swipe' || type == 'impersonate' || type == 'quiet' || type == 'continue' ? type : 'group_chat';
setCharacterId(chId);
setCharacterName(characters[chId].name);
if (power_user.show_group_chat_queue) {
printGroupMembers();
}
await eventSource.emit(event_types.GROUP_MEMBER_DRAFTED, chId);
if (type !== 'swipe' && type !== 'impersonate' && !isStreamingEnabled()) {
@ -885,6 +897,10 @@ async function generateGroupWrapper(by_auto_mode, type = null, params = {}) {
messageChunk = textResult?.messageChunk;
}
}
if (power_user.show_group_chat_queue) {
groupChatQueueOrder.delete(characters[chId].avatar);
groupChatQueueOrder.forEach((value, key, map) => map.set(key, value - 1));
}
}
} finally {
typingIndicator.hide();
@ -892,6 +908,10 @@ async function generateGroupWrapper(by_auto_mode, type = null, params = {}) {
is_group_generating = false;
setSendButtonState(false);
setCharacterId(undefined);
if (power_user.show_group_chat_queue) {
groupChatQueueOrder = new Map();
printGroupMembers();
}
setCharacterName('');
activateSendButtons();
showSwipeButtons();
@ -1318,6 +1338,14 @@ function getGroupCharacterBlock(character) {
template.attr('chid', characters.indexOf(character));
template.find('.ch_fav').val(isFav);
template.toggleClass('is_fav', isFav);
let queuePosition = groupChatQueueOrder.get(character.avatar);
if (queuePosition) {
template.find('.queue_position').text(queuePosition);
template.toggleClass('is_queued', queuePosition > 1);
template.toggleClass('is_active', queuePosition === 1);
}
template.toggleClass('disabled', isGroupMemberDisabled(character.avatar));
// Display inline tags
@ -1610,6 +1638,7 @@ export async function openGroupById(groupId) {
select_group_chats(groupId);
if (selected_group !== groupId) {
groupChatQueueOrder = new Map();
await clearChat();
cancelTtsPlay();
selected_group = groupId;