| 765 | 765 | */ |
| 766 | 766 | async function handleTagImport(character, { importSetting = null } = {}) { |
| 767 | 767 | /** @type {string[]} */ |
| 768 | + const alreadyAssignedTags = tag_map[character.avatar] ?? []; |
| 768 | 769 | const importTags = character.tags.map(t => t.trim()).filter(t => t) |
| 769 | 770 | .filter(t => !IMPORT_EXLCUDED_TAGS.includes(t)) |
| 771 | + .filter(t => { |
| 772 | + const existingTag = getTag(t); |
| 773 | + return !existingTag || !alreadyAssignedTags.includes(existingTag.id); |
| 774 | + }) |
| 770 | 775 | .slice(0, ANTI_TROLL_MAX_TAGS); |
| 771 | 776 | const existingTags = getExistingTags(importTags); |
| 772 | 777 | const newTags = importTags.filter(t => !existingTags.some(existingTag => existingTag.name.toLowerCase() === t.toLowerCase())) |