diff --git a/public/index.html b/public/index.html index 4eb5320cc..df4e109bf 100644 --- a/public/index.html +++ b/public/index.html @@ -2673,6 +2673,8 @@
+
+
diff --git a/public/scripts/bookmarks.js b/public/scripts/bookmarks.js index 9496a38bc..ac5f09d31 100644 --- a/public/scripts/bookmarks.js +++ b/public/scripts/bookmarks.js @@ -213,6 +213,7 @@ async function convertSoloToGroupChat() { avatar_url: avatar, allow_self_responses: activationStrategy, activation_strategy: allowSelfResponses, + disabled_members: [], chat_metadata: metadata, fav: favChecked, chat_id: chatName, diff --git a/public/scripts/group-chats.js b/public/scripts/group-chats.js index 8a745e0b7..dcb87e057 100644 --- a/public/scripts/group-chats.js +++ b/public/scripts/group-chats.js @@ -282,6 +282,9 @@ async function getGroups() { // Convert groups to new format for (const group of groups) { + if (group.disabled_members == undefined) { + group.disabled_members = []; + } if (group.chat_id == undefined) { group.chat_id = group.id; group.chats = [group.id]; @@ -348,34 +351,15 @@ function getGroupAvatar(group) { } } - // Cohee: there's probably a smarter way to do this.. - if (memberAvatars.length === 1) { - const groupAvatar = $("#group_avatars_template .collage_1").clone(); - groupAvatar.find(".img_1").attr("src", memberAvatars[0]); - return groupAvatar; - } + const avatarCount = memberAvatars.length; - if (memberAvatars.length === 2) { - const groupAvatar = $("#group_avatars_template .collage_2").clone(); - groupAvatar.find(".img_1").attr("src", memberAvatars[0]); - groupAvatar.find(".img_2").attr("src", memberAvatars[1]); - return groupAvatar; - } + if (avatarCount >= 1 && avatarCount <= 4) { + const groupAvatar = $(`#group_avatars_template .collage_${avatarCount}`).clone(); - if (memberAvatars.length === 3) { - const groupAvatar = $("#group_avatars_template .collage_3").clone(); - groupAvatar.find(".img_1").attr("src", memberAvatars[0]); - groupAvatar.find(".img_2").attr("src", memberAvatars[1]); - groupAvatar.find(".img_3").attr("src", memberAvatars[2]); - return groupAvatar; - } + for (let i = 0; i < avatarCount; i++) { + groupAvatar.find(`.img_${i + 1}`).attr("src", memberAvatars[i]); + } - if (memberAvatars.length === 4) { - const groupAvatar = $("#group_avatars_template .collage_4").clone(); - groupAvatar.find(".img_1").attr("src", memberAvatars[0]); - groupAvatar.find(".img_2").attr("src", memberAvatars[1]); - groupAvatar.find(".img_3").attr("src", memberAvatars[2]); - groupAvatar.find(".img_4").attr("src", memberAvatars[3]); return groupAvatar; } @@ -436,7 +420,7 @@ async function generateGroupWrapper(by_auto_mode, type = null, params = {}) { let isGenerationDone = false; let isGenerationAborted = false; - if (userInput && userInput.length && !by_auto_mode) { + if (userInput?.length && !by_auto_mode) { isUserInput = true; activationText = userInput; messagesBefore++; @@ -474,6 +458,7 @@ async function generateGroupWrapper(by_auto_mode, type = null, params = {}) { } const activationStrategy = Number(group.activation_strategy ?? group_activation_strategy.NATURAL); + const enabledMembers = group.members.filter(x => !group.disabled_members.includes(x)); let activatedMembers = []; if (params && typeof params.force_chid == 'number') { @@ -484,7 +469,6 @@ async function generateGroupWrapper(by_auto_mode, type = null, params = {}) { if (activatedMembers.length === 0) { activatedMembers = activateListOrder(group.members.slice(0, 1)); } - } else if (type === "swipe") { activatedMembers = activateSwipe(group.members); @@ -499,13 +483,18 @@ async function generateGroupWrapper(by_auto_mode, type = null, params = {}) { activatedMembers = activateImpersonate(group.members); } else if (activationStrategy === group_activation_strategy.NATURAL) { - activatedMembers = activateNaturalOrder(group.members, activationText, lastMessage, group.allow_self_responses, isUserInput); + activatedMembers = activateNaturalOrder(enabledMembers, activationText, lastMessage, group.allow_self_responses, isUserInput); } else if (activationStrategy === group_activation_strategy.LIST) { - activatedMembers = activateListOrder(group.members); + activatedMembers = activateListOrder(enabledMembers); } - // now the real generation begins: cycle through every character + if (activatedMembers.length === 0) { + toastr.warning('All group members are disabled. Enable at least one to get a reply.'); + throw new Error('All group members are disabled'); + } + + // now the real generation begins: cycle through every activated character for (const chId of activatedMembers) { isGenerationDone = false; const generateType = type == "swipe" || type == "impersonate" || type == "quiet" ? type : "group_chat"; @@ -514,7 +503,7 @@ async function generateGroupWrapper(by_auto_mode, type = null, params = {}) { await Generate(generateType, { automatic_trigger: by_auto_mode, ...(params || {}) }); - if (type !== "swipe" && type !== "impersonate" && !isMultigenEnabled()) { + if (type !== "swipe" && type !== "impersonate" && !isMultigenEnabled() && !isStreamingEnabled()) { // update indicator and scroll down typingIndicator .find(".typing_indicator_name") @@ -949,6 +938,7 @@ function select_group_chats(groupId, skipAnimation) { group.members.includes(character.avatar) ) { template.css({ 'order': group.members.indexOf(character.avatar) }); + template.toggleClass('disabled', group.disabled_members.includes(character.avatar)); $("#rm_group_members").append(template); } else { $("#rm_group_add_members").append(template); @@ -1030,6 +1020,23 @@ function select_group_chats(groupId, skipAnimation) { await modifyGroupMember(groupId, member, false); } + if (action === 'enable') { + member.removeClass('disabled'); + const _thisGroup = groups.find(x => x.id === groupId); + const index = _thisGroup.disabled_members.indexOf(member.data('id')); + if (index !== -1) { + _thisGroup.disabled_members.splice(index, 1); + } + await editGroup(groupId); + } + + if (action === 'disable') { + member.addClass('disabled'); + const _thisGroup = groups.find(x => x.id === groupId); + _thisGroup.disabled_members.push(member.data('id')); + await editGroup(groupId); + } + if (action === 'up' || action === 'down') { await reorderGroupMember(groupId, member, action); } @@ -1138,6 +1145,7 @@ async function createGroup() { avatar_url: avatar_url, allow_self_responses: allow_self_responses, activation_strategy: activation_strategy, + disabled_members: [], chat_metadata: {}, fav: fav_grp_checked, chat_id: chatName, diff --git a/public/style.css b/public/style.css index 7376a82fb..a81bc6ceb 100644 --- a/public/style.css +++ b/public/style.css @@ -3000,11 +3000,28 @@ body .ui-widget-content li:hover { align-items: center; } +#rm_group_members .right_menu_button[data-action="speak"], +#rm_group_members .group_member:not(.disabled) .right_menu_button[data-action="disable"] { + opacity: 0.4; + filter: brightness(0.5); + transition: all 0.2s ease-in-out; +} + +#rm_group_members .right_menu_button[data-action="speak"]:hover, +#rm_group_members .group_member:not(.disabled) .right_menu_button[data-action="disable"]:hover { + opacity: inherit; + filter: inherit; +} + +#rm_group_members .right_menu_button[data-action="speak"]:hover { + filter: drop-shadow(0px 0px 2px green); +} + /* Rules for icon display */ -#rm_group_members .group_member[order="start"] .fa-chevron-down, -#rm_group_members .group_member[order="end"] .fa-chevron-up, -#rm_group_add_members .right_menu_button:not(.fa-plus, .fa-id-badge), -#rm_group_members .fa-plus { +#rm_group_add_members .right_menu_button:not([data-action="add"], [data-action="view"]), +#rm_group_members .right_menu_button[data-action="add"], +#rm_group_members .group_member.disabled .right_menu_button[data-action="disable"], +#rm_group_members .group_member:not(.disabled) .right_menu_button[data-action="enable"] { display: none; } diff --git a/server.js b/server.js index 09c5ade6d..0cee005e5 100644 --- a/server.js +++ b/server.js @@ -1993,6 +1993,7 @@ app.post('/creategroup', jsonParser, (request, response) => { avatar_url: request.body.avatar_url, allow_self_responses: !!request.body.allow_self_responses, activation_strategy: request.body.activation_strategy ?? 0, + disabled_members: request.body.disabled_members ?? [], chat_metadata: request.body.chat_metadata ?? {}, fav: request.body.fav, chat_id: request.body.chat_id ?? id,