mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
#356 Add group chat member ghosting
This commit is contained in:
@ -2673,6 +2673,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="ch_name"></div>
|
<div class="ch_name"></div>
|
||||||
<div class="group_member_icon">
|
<div class="group_member_icon">
|
||||||
|
<div title="Temporarily disable automatic replies from this character" data-action="disable" class="right_menu_button fa-solid fa-lg fa-comment-slash"></div>
|
||||||
|
<div title="Enable automatic replies from this character" data-action="enable" class="right_menu_button fa-solid fa-lg fa-comment-slash"></div>
|
||||||
<div title="Trigger a message from this character" data-action="speak" class="right_menu_button fa-solid fa-lg fa-comment"></div>
|
<div title="Trigger a message from this character" data-action="speak" class="right_menu_button fa-solid fa-lg fa-comment"></div>
|
||||||
<div class="flexFlowColumn flex-container">
|
<div class="flexFlowColumn flex-container">
|
||||||
<div title="Move up" data-action="up" class="right_menu_button fa-solid fa-chevron-up"></div>
|
<div title="Move up" data-action="up" class="right_menu_button fa-solid fa-chevron-up"></div>
|
||||||
|
@ -213,6 +213,7 @@ async function convertSoloToGroupChat() {
|
|||||||
avatar_url: avatar,
|
avatar_url: avatar,
|
||||||
allow_self_responses: activationStrategy,
|
allow_self_responses: activationStrategy,
|
||||||
activation_strategy: allowSelfResponses,
|
activation_strategy: allowSelfResponses,
|
||||||
|
disabled_members: [],
|
||||||
chat_metadata: metadata,
|
chat_metadata: metadata,
|
||||||
fav: favChecked,
|
fav: favChecked,
|
||||||
chat_id: chatName,
|
chat_id: chatName,
|
||||||
|
@ -282,6 +282,9 @@ async function getGroups() {
|
|||||||
|
|
||||||
// Convert groups to new format
|
// Convert groups to new format
|
||||||
for (const group of groups) {
|
for (const group of groups) {
|
||||||
|
if (group.disabled_members == undefined) {
|
||||||
|
group.disabled_members = [];
|
||||||
|
}
|
||||||
if (group.chat_id == undefined) {
|
if (group.chat_id == undefined) {
|
||||||
group.chat_id = group.id;
|
group.chat_id = group.id;
|
||||||
group.chats = [group.id];
|
group.chats = [group.id];
|
||||||
@ -348,34 +351,15 @@ function getGroupAvatar(group) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cohee: there's probably a smarter way to do this..
|
const avatarCount = memberAvatars.length;
|
||||||
if (memberAvatars.length === 1) {
|
|
||||||
const groupAvatar = $("#group_avatars_template .collage_1").clone();
|
|
||||||
groupAvatar.find(".img_1").attr("src", memberAvatars[0]);
|
|
||||||
return groupAvatar;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (memberAvatars.length === 2) {
|
if (avatarCount >= 1 && avatarCount <= 4) {
|
||||||
const groupAvatar = $("#group_avatars_template .collage_2").clone();
|
const groupAvatar = $(`#group_avatars_template .collage_${avatarCount}`).clone();
|
||||||
groupAvatar.find(".img_1").attr("src", memberAvatars[0]);
|
|
||||||
groupAvatar.find(".img_2").attr("src", memberAvatars[1]);
|
|
||||||
return groupAvatar;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (memberAvatars.length === 3) {
|
for (let i = 0; i < avatarCount; i++) {
|
||||||
const groupAvatar = $("#group_avatars_template .collage_3").clone();
|
groupAvatar.find(`.img_${i + 1}`).attr("src", memberAvatars[i]);
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
return groupAvatar;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -436,7 +420,7 @@ async function generateGroupWrapper(by_auto_mode, type = null, params = {}) {
|
|||||||
let isGenerationDone = false;
|
let isGenerationDone = false;
|
||||||
let isGenerationAborted = false;
|
let isGenerationAborted = false;
|
||||||
|
|
||||||
if (userInput && userInput.length && !by_auto_mode) {
|
if (userInput?.length && !by_auto_mode) {
|
||||||
isUserInput = true;
|
isUserInput = true;
|
||||||
activationText = userInput;
|
activationText = userInput;
|
||||||
messagesBefore++;
|
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 activationStrategy = Number(group.activation_strategy ?? group_activation_strategy.NATURAL);
|
||||||
|
const enabledMembers = group.members.filter(x => !group.disabled_members.includes(x));
|
||||||
let activatedMembers = [];
|
let activatedMembers = [];
|
||||||
|
|
||||||
if (params && typeof params.force_chid == 'number') {
|
if (params && typeof params.force_chid == 'number') {
|
||||||
@ -484,7 +469,6 @@ async function generateGroupWrapper(by_auto_mode, type = null, params = {}) {
|
|||||||
if (activatedMembers.length === 0) {
|
if (activatedMembers.length === 0) {
|
||||||
activatedMembers = activateListOrder(group.members.slice(0, 1));
|
activatedMembers = activateListOrder(group.members.slice(0, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (type === "swipe") {
|
else if (type === "swipe") {
|
||||||
activatedMembers = activateSwipe(group.members);
|
activatedMembers = activateSwipe(group.members);
|
||||||
@ -499,13 +483,18 @@ async function generateGroupWrapper(by_auto_mode, type = null, params = {}) {
|
|||||||
activatedMembers = activateImpersonate(group.members);
|
activatedMembers = activateImpersonate(group.members);
|
||||||
}
|
}
|
||||||
else if (activationStrategy === group_activation_strategy.NATURAL) {
|
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) {
|
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) {
|
for (const chId of activatedMembers) {
|
||||||
isGenerationDone = false;
|
isGenerationDone = false;
|
||||||
const generateType = type == "swipe" || type == "impersonate" || type == "quiet" ? type : "group_chat";
|
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 || {}) });
|
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
|
// update indicator and scroll down
|
||||||
typingIndicator
|
typingIndicator
|
||||||
.find(".typing_indicator_name")
|
.find(".typing_indicator_name")
|
||||||
@ -949,6 +938,7 @@ function select_group_chats(groupId, skipAnimation) {
|
|||||||
group.members.includes(character.avatar)
|
group.members.includes(character.avatar)
|
||||||
) {
|
) {
|
||||||
template.css({ 'order': group.members.indexOf(character.avatar) });
|
template.css({ 'order': group.members.indexOf(character.avatar) });
|
||||||
|
template.toggleClass('disabled', group.disabled_members.includes(character.avatar));
|
||||||
$("#rm_group_members").append(template);
|
$("#rm_group_members").append(template);
|
||||||
} else {
|
} else {
|
||||||
$("#rm_group_add_members").append(template);
|
$("#rm_group_add_members").append(template);
|
||||||
@ -1030,6 +1020,23 @@ function select_group_chats(groupId, skipAnimation) {
|
|||||||
await modifyGroupMember(groupId, member, false);
|
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') {
|
if (action === 'up' || action === 'down') {
|
||||||
await reorderGroupMember(groupId, member, action);
|
await reorderGroupMember(groupId, member, action);
|
||||||
}
|
}
|
||||||
@ -1138,6 +1145,7 @@ async function createGroup() {
|
|||||||
avatar_url: avatar_url,
|
avatar_url: avatar_url,
|
||||||
allow_self_responses: allow_self_responses,
|
allow_self_responses: allow_self_responses,
|
||||||
activation_strategy: activation_strategy,
|
activation_strategy: activation_strategy,
|
||||||
|
disabled_members: [],
|
||||||
chat_metadata: {},
|
chat_metadata: {},
|
||||||
fav: fav_grp_checked,
|
fav: fav_grp_checked,
|
||||||
chat_id: chatName,
|
chat_id: chatName,
|
||||||
|
@ -3000,11 +3000,28 @@ body .ui-widget-content li:hover {
|
|||||||
align-items: center;
|
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 */
|
/* Rules for icon display */
|
||||||
#rm_group_members .group_member[order="start"] .fa-chevron-down,
|
#rm_group_add_members .right_menu_button:not([data-action="add"], [data-action="view"]),
|
||||||
#rm_group_members .group_member[order="end"] .fa-chevron-up,
|
#rm_group_members .right_menu_button[data-action="add"],
|
||||||
#rm_group_add_members .right_menu_button:not(.fa-plus, .fa-id-badge),
|
#rm_group_members .group_member.disabled .right_menu_button[data-action="disable"],
|
||||||
#rm_group_members .fa-plus {
|
#rm_group_members .group_member:not(.disabled) .right_menu_button[data-action="enable"] {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1993,6 +1993,7 @@ app.post('/creategroup', jsonParser, (request, response) => {
|
|||||||
avatar_url: request.body.avatar_url,
|
avatar_url: request.body.avatar_url,
|
||||||
allow_self_responses: !!request.body.allow_self_responses,
|
allow_self_responses: !!request.body.allow_self_responses,
|
||||||
activation_strategy: request.body.activation_strategy ?? 0,
|
activation_strategy: request.body.activation_strategy ?? 0,
|
||||||
|
disabled_members: request.body.disabled_members ?? [],
|
||||||
chat_metadata: request.body.chat_metadata ?? {},
|
chat_metadata: request.body.chat_metadata ?? {},
|
||||||
fav: request.body.fav,
|
fav: request.body.fav,
|
||||||
chat_id: request.body.chat_id ?? id,
|
chat_id: request.body.chat_id ?? id,
|
||||||
|
Reference in New Issue
Block a user