@@ -483,6 +483,89 @@ function attachFallbackImage(imgElement, fallbackSrc) {
483483 } ;
484484}
485485
486+ const verificationItemNameCache = new Map ( ) ;
487+ const verificationItemNameRequestCache = new Map ( ) ;
488+ const runeliteItemIdNameCache = new Map ( ) ;
489+ let runeliteItemIdNameLoadPromise = null ;
490+
491+ function toDisplayItemName ( itemIdConstantName ) {
492+ return itemIdConstantName
493+ . toLowerCase ( )
494+ . split ( '_' )
495+ . map ( ( segment ) => segment . charAt ( 0 ) . toUpperCase ( ) + segment . slice ( 1 ) )
496+ . join ( ' ' )
497+ . trim ( ) ;
498+ }
499+
500+ function loadRuneLiteItemIdNames ( ) {
501+ if ( runeliteItemIdNameLoadPromise ) {
502+ return runeliteItemIdNameLoadPromise ;
503+ }
504+
505+ const rawItemIdFileUrl = 'https://raw.githubusercontent.com/runelite/runelite/master/runelite-api/src/main/java/net/runelite/api/ItemID.java' ;
506+ const itemIdLinePattern = / ^ \s * p u b l i c \s + s t a t i c \s + f i n a l \s + i n t \s + ( [ A - Z 0 - 9 _ ] + ) \s * = \s * ( \d + ) \s * ; \s * $ / gm;
507+
508+ runeliteItemIdNameLoadPromise = fetch ( rawItemIdFileUrl )
509+ . then ( ( response ) => {
510+ if ( ! response . ok ) {
511+ return '' ;
512+ }
513+ return response . text ( ) ;
514+ } )
515+ . then ( ( source ) => {
516+ if ( ! source ) {
517+ return runeliteItemIdNameCache ;
518+ }
519+
520+ let match = itemIdLinePattern . exec ( source ) ;
521+ while ( match !== null ) {
522+ const constantName = match [ 1 ] ;
523+ const parsedItemId = parseInt ( match [ 2 ] , 10 ) ;
524+ if ( ! Number . isNaN ( parsedItemId ) && ! runeliteItemIdNameCache . has ( parsedItemId ) ) {
525+ runeliteItemIdNameCache . set ( parsedItemId , toDisplayItemName ( constantName ) ) ;
526+ }
527+ match = itemIdLinePattern . exec ( source ) ;
528+ }
529+
530+ return runeliteItemIdNameCache ;
531+ } )
532+ . catch ( ( ) => runeliteItemIdNameCache ) ;
533+
534+ return runeliteItemIdNameLoadPromise ;
535+ }
536+
537+ function formatVerificationItemTooltip ( itemId , itemName , isRecorded ) {
538+ const actionHint = isRecorded ? 'click to mark incomplete' : 'click to mark complete' ;
539+ const displayName = itemName || 'item' ;
540+ return `${ displayName } (${ itemId } ) - ${ actionHint } ` ;
541+ }
542+
543+ function fetchVerificationItemName ( itemId ) {
544+ if ( verificationItemNameCache . has ( itemId ) ) {
545+ return Promise . resolve ( verificationItemNameCache . get ( itemId ) ) ;
546+ }
547+
548+ if ( verificationItemNameRequestCache . has ( itemId ) ) {
549+ return verificationItemNameRequestCache . get ( itemId ) ;
550+ }
551+
552+ const itemNameRequest = loadRuneLiteItemIdNames ( )
553+ . then ( ( itemMap ) => {
554+ const itemName = itemMap . get ( itemId ) || null ;
555+ verificationItemNameCache . set ( itemId , itemName ) ;
556+ verificationItemNameRequestCache . delete ( itemId ) ;
557+ return itemName ;
558+ } )
559+ . catch ( ( ) => {
560+ verificationItemNameCache . set ( itemId , null ) ;
561+ verificationItemNameRequestCache . delete ( itemId ) ;
562+ return null ;
563+ } ) ;
564+
565+ verificationItemNameRequestCache . set ( itemId , itemNameRequest ) ;
566+ return itemNameRequest ;
567+ }
568+
486569function openTaskActionModal ( options ) {
487570 const {
488571 actionLabel,
@@ -553,12 +636,18 @@ function openTaskActionModal(options) {
553636 image . width = 36 ;
554637 image . height = 32 ;
555638 image . loading = 'lazy' ;
556- image . title = isRecorded
557- ? `Item ID: ${ itemId } (click to mark incomplete)`
558- : `Item ID: ${ itemId } (click to mark complete)` ;
639+ image . title = formatVerificationItemTooltip ( itemId , null , isRecorded ) ;
559640 image . setAttribute ( 'role' , 'button' ) ;
560641 image . tabIndex = 0 ;
561642
643+ fetchVerificationItemName ( itemId ) . then ( ( itemName ) => {
644+ if ( ! image . isConnected ) {
645+ return ;
646+ }
647+ image . title = formatVerificationItemTooltip ( itemId , itemName , isRecorded ) ;
648+ image . alt = itemName ? `${ itemName } (${ itemId } )` : `Item ${ itemId } ` ;
649+ } ) ;
650+
562651 const toggleItem = ( ) => {
563652 if ( selectedItemIds . has ( itemId ) ) {
564653 selectedItemIds . delete ( itemId ) ;
0 commit comments