From 5d957a88c3e670a352253ef2a4a57aceaed0ea4b Mon Sep 17 00:00:00 2001 From: SatinIsle <98125273+SatinIsle@users.noreply.github.com> Date: Sat, 7 Jun 2025 04:36:37 +0100 Subject: [PATCH] [WIP] Custom Links in Character Directory [Advice Requested] (#17790) * [WIP] Custom Links in Character Directory Added custom links to the character directory. They work fine at the moment as just plain text, even if you have to copy and paste them it's an improvement. However, I wanted to keep this in WIP until I have a chance to ask our TGUI experts if it is possible to make them a clickable link. * maks link usable * ignore bad links * . --------- Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com> --- code/modules/client/verbs/character_directory.dm | 4 ++++ code/modules/paperwork/pen.dm | 3 ++- .../CharacterDirectoryViewCharacter.tsx | 10 ++++++++++ .../tgui/interfaces/CharacterDirectory/constants.ts | 3 +++ .../tgui/interfaces/CharacterDirectory/functions.ts | 11 +++++++++++ .../tgui/interfaces/CharacterDirectory/types.ts | 1 + 6 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 tgui/packages/tgui/interfaces/CharacterDirectory/functions.ts diff --git a/code/modules/client/verbs/character_directory.dm b/code/modules/client/verbs/character_directory.dm index 4352fd0af4..d9665870c4 100644 --- a/code/modules/client/verbs/character_directory.dm +++ b/code/modules/client/verbs/character_directory.dm @@ -70,6 +70,7 @@ GLOBAL_DATUM(character_directory, /datum/character_directory) var/sexualitytag = null var/eventtag = GLOB.vantag_choices_list[VANTAG_NONE] var/flavor_text = null + var/custom_link = null var/tag var/erptag var/character_ad @@ -116,6 +117,8 @@ GLOBAL_DATUM(character_directory, /datum/character_directory) ooc_notes += "\n\nDISLIKES\n\n[H.ooc_notes_dislikes]" if(LAZYLEN(H.flavor_texts)) flavor_text = H.flavor_texts["general"] + if(H.custom_link) + custom_link = H.custom_link if(isAI(C.mob)) var/mob/living/silicon/ai/A = C.mob @@ -234,6 +237,7 @@ GLOBAL_DATUM(character_directory, /datum/character_directory) "erptag" = erptag, "character_ad" = character_ad, "flavor_text" = flavor_text, + "custom_link" = custom_link, ))) data["directory"] = directory_mobs diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 08d9ebff49..3f73ddc2ce 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -101,9 +101,10 @@ var/colors = list("black","blue","red") /obj/item/pen/AltClick(mob/user) + if(!Adjacent(user)) + return to_chat(user, span_notice("Click.")) playsound(src, 'sound/items/penclick.ogg', 50, 1) - return /obj/item/pen/multi/attack_self(mob/user) if(++selectedColor > 3) diff --git a/tgui/packages/tgui/interfaces/CharacterDirectory/CharacterDirectoryViewCharacter.tsx b/tgui/packages/tgui/interfaces/CharacterDirectory/CharacterDirectoryViewCharacter.tsx index 6cfbb172db..ebcb6e1423 100644 --- a/tgui/packages/tgui/interfaces/CharacterDirectory/CharacterDirectoryViewCharacter.tsx +++ b/tgui/packages/tgui/interfaces/CharacterDirectory/CharacterDirectoryViewCharacter.tsx @@ -1,6 +1,7 @@ import { Box, Button, Section, Table } from 'tgui-core/components'; import { getTagColor } from './constants'; +import { validateLink } from './functions'; import type { mobEntry } from './types'; export const ViewCharacter = (props: { @@ -108,6 +109,15 @@ export const ViewCharacter = (props: { {overlay.flavor_text || 'Unset.'} +
+ + {validateLink(overlay.custom_link) ? ( + {overlay.custom_link} + ) : ( + 'Unset.' + )} + +
); }; diff --git a/tgui/packages/tgui/interfaces/CharacterDirectory/constants.ts b/tgui/packages/tgui/interfaces/CharacterDirectory/constants.ts index d7b99dabf8..2b383662ed 100644 --- a/tgui/packages/tgui/interfaces/CharacterDirectory/constants.ts +++ b/tgui/packages/tgui/interfaces/CharacterDirectory/constants.ts @@ -16,3 +16,6 @@ export const getTagColor = (tag: string) => { return 'black'; } }; + +export const urlRegex = + /^https:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/; diff --git a/tgui/packages/tgui/interfaces/CharacterDirectory/functions.ts b/tgui/packages/tgui/interfaces/CharacterDirectory/functions.ts new file mode 100644 index 0000000000..d2238de17a --- /dev/null +++ b/tgui/packages/tgui/interfaces/CharacterDirectory/functions.ts @@ -0,0 +1,11 @@ +import { urlRegex } from './constants'; + +export function validateLink(url: string | null) { + if (!url) { + return false; + } + if (urlRegex.test(url)) { + return true; + } + return false; +} diff --git a/tgui/packages/tgui/interfaces/CharacterDirectory/types.ts b/tgui/packages/tgui/interfaces/CharacterDirectory/types.ts index 407ef60216..0ea31397d9 100644 --- a/tgui/packages/tgui/interfaces/CharacterDirectory/types.ts +++ b/tgui/packages/tgui/interfaces/CharacterDirectory/types.ts @@ -26,4 +26,5 @@ export type mobEntry = { erptag: string; character_ad: string; flavor_text: string; + custom_link: string; };