################################################################################ # # # M e s s a g e C o n s t r u c t o r # # L I B R A R Y # # # # A set of utilities to make displaying text pretty, uniform, and easy # # # # Authors: |Anthony| # # Version: 0.5 # # dScript Version: 1.0.3-DEV_b619 # # # # For bleeding-edge code, bug reports, code contributions, and feature # # requests, visit the GitHub project: # # - github.com/AnthonyAMC/Public-Denizen-Scripts/blob/master/MessageConstructors.yml # # # Has my work helped you in some way? Show your support by clicking the # # Like button. # # Feeling generous? Get me a coffee :D # # https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=NPXKHCNMTGSUG # # #-------------------------------------- # # # #--- About this script # # # # # # This library will be a dependency for nearly all of my scripts. Mainly so # # I don't have to duplicate the code so much, but also because it makes # # development and maintenance easier. # # # # Other scripters are free to implement this library in their own scripts. # # Just make sure you credit the author. If you are releasing a script that # # uses this library, be sure to tell your users to install it from here. # # Do not include this library, or parts of it, directly in your public # # scripts. # # # # # ################################################################################ # # Message Constructor Library Version # # Handles Versioning Checks # MSG_Version: type: version author: Anthony name: MessageConstructorLibrary version: 0.5 description: A Library for Message Construction id: 90 # #--------------------------------------- # ################################################################################ # # #-------------------------------------- # # Pagination Command # # - Accepts starting page number as a required argument. # - Requires flags to be set for Headers and Chat Entries. # - Can be further customized - see msgBoxed. # # Usage: # - flag player "chat_header1:<&l>Heading One" # - flag player "chat_header2:<&o>Heading Two" # - flag player "chat_entries:Line One|Line Two|Line Three" # - execute as_player "paginate 1" # paginate_command: type: command debug: false name: paginate description: For internal use. Scrolls text pages. usage: /paginate <<>pagenumber<>> permission message: You don't have permission. allowed help: - determine > tab complete: - if !> queue clear script: - run s@msgBoxed 'def:Servername|||paginate||53|5|' # #--------------------------------------- # ################################################################################ # # #-------------------------------------- # # Message Prefixer # # - Pop-Up on hover shows your script title and 'Click for Help' # - Clicking the prefix runs /%title% help # - Long messages are automatically linewrapped # # Usage: # - run s@msgPrefixed 'def:%yourScriptTitle%|<&c>%yourMessageHere%' # msgPrefixed: type: item debug: false definitions: title|msg material: i@human_skull display name: "<&4> [<&6>---<&4>]" lore: - <&5>Click for Help script: - ^define text '<&4>[<&6>%title%<&4>]' - ^if ! { - announce to_console "%text% %msg%" - goto 'end' } - ^define icon 'i@human_skull[display_name=]' - ^adjust %icon% 'lore:<&sp>|<&5> Click for Help' save:item - ^define hover '{}' - ^define click '/%title% help' - ^define button '"text":"%text%","clickEvent":{"action":"run_command","value":"%click%"},"hoverEvent":{"action":"show_item","value":"%hover%"}' - ^define spacer '"text":" "' - ^foreach '>|]>]>' { - ^execute as_server 'tellraw {"text":"","extra":[{%button%},{%spacer%},{"text":""}]}' } - mark 'end' # # END msgPrefixed #-------------------------------------- # # Boxed Message # # - Encapsulate your messages in a neat and tidy box format # Messages sent through will be linewrapped and given a header and footer # - Header displays specified script title, page title, and page number(s) # - Page numbers are clickable to ease navigation # - Footer can display clickable buttons for your script authors # - You must have a valid author item script named %script%_Author_%authorname% # # Definitions Explained: # # %script% - The prefix used to find your authors # %title% - The title to display in the Header # %subTitle% - The subtitle to display in the Header # %command% - The command to run when the page buttons are clicked # %page% - The current page to display # %pageWidth% - How many characters (roughly) to display on one line # %pageHeight% - How many lines in the body of the message should be on one page # %entries% - The complete contents of the document your are working with. # Every entry in the list is displayed on its own line. Long # entries are automatically linewrapped to fit the box message. # # Usage: # - run s@msgBoxed 'def:%script%|%title%|%subTitle%|%command%|%page%|%pageWidth%|%pageHeight%|%entries%' # msgBoxed: type: task debug: false definitions: script|title|subTitle|command|page|pageWidth|pageHeight script: - ^define entries '' - ^foreach 'li@script|title|subTitle|command|page|pageWidth|pageHeight': - define %value% '' - ^define paragraphs ']>' - ^if %page% < 1 { - define page '1' } - ^define pageInfo ']>' - ^define pageTotal '' - ^if %page% > %pageTotal% { - define page '%pageTotal%' } - ^define lines ']>' - ^define cList 'li@0/black|1/dark_blue|2/dark_green|3/dark_aqua|4/dark_red|5/dark_purple|6/gold|7/gray|8/dark_gray|9/blue|a/green|b/aqua|c/red|d/light_purple|e/yellow|f/white|k/obfuscated|l/bold|m/strikethrough|n/underline|o/italic|r/reset' - ^define i 0 - ^foreach 'li@title|subTitle': - define this '%value%' - define thisValue '' - define clean%this% 'li@' - foreach '': - define i - define word '%value%' - if '%word%' == '' { - define clean%this% ']>' - foreach next } - if !<&ss>@<&ss><&chr[260f]>]> { - define clean%this% '' - foreach next } - define text '<&ss>@<&ss><&chr[260f]>].split_by[_-_].get[2].replace[\u0026].with[&].unescaped>' - define %text% '<&bs>u0026]>' - define clean%this% '' - define clean%this% ']>' - ^define hpad '' - ^define heading ']> ' - ^define pagesInfo '<&7><&o>Page <&f>%page% <&7><&o>of <&f>%pageTotal%' - ^define pad '].sub[].mul[1.5].round>' - ^if ! { - ^announce to_console "<&2>|<&pipe.pad_left[].with[-]>" - ^announce to_console "<&2>|<&sp><&sp><&sp><&6> <&7.pad_right[%pad%].with[ ]>" - ^announce to_console "<&2>|<&f>" - ^foreach { - announce to_console "<&2>|<&f><&sp><&sp>" } - ^announce to_console "<&2>|" - ^inject locally msgsFooter - ^queue clear } - ^define finalHeading 'li@' - ^foreach '': - define c '' - if '%c%' == '' { - if { - define c '%lc%' } else { - define c 'white' } } else { - define c '' } - define lc '%c%' - if { - define split '@<&ss><&chr[260f]>].split_by[_-_]>' - define type '' - define text ' ' - if '%type%' == 'URL' { - define url 'http<&co>//' - define hover '' - define button '"color":"","text":"%text%","clickEvent":{"action":"open_url","value":"%url%"},"hoverEvent":{"action":"show_text","value":"%hover%"}' } else if '%type%' == 'command' { - define tcommand '/' - define hover '' - define button '"color":"","text":"%text%","clickEvent":{"action":"run_command","value":"%tcommand%"},"hoverEvent":{"action":"show_text","value":"%hover%"}' } else if '%type' == 'hint' { - define hint '/' - define hover '].replace[\u0026].with[&].unescaped>' - define button '"text":"%text%","clickEvent":{"action":"suggest_command","value":"%hint%"},"hoverEvent":{"action":"show_text","value":"%hover%"}' } else if '%type' == 'suggest' { - define suggest '' - define hover '].replace[\u0026].with[&].unescaped>' - define button '"text":"%text%","clickEvent":{"action":"suggest_command","value":"%suggest%"},"hoverEvent":{"action":"show_text","value":"%hover%"}' } else if '%type%' == 'chat' { - define chat '' - define hover '' - define button '"text":"%text%","clickEvent":{"action":"run_command","value":"%chat%"},"hoverEvent":{"action":"show_text","value":"%hover%"}' } else if '%type%' == 'hover' { - define hover '' - define button '"color":"","text":"%text%","hoverEvent":{"action":"show_text","value":"%hover%"}' } - define finalHeading '' } else { - if '%value%' == '' { - define value '&sp' } - define finalHeading '","color":""}|{"text":"<&sp>"}]>' } - ^define finalHeading '' - ^inject locally msgsHeader - ^inject locally msgsBody - ^inject locally msgsFooter msgsHeader: - ^if %page% == 1 { - define buttonThis '"text":"1"' } else { - define clickThis '/%command% ' - define buttonThis '"text":"%page%","clickEvent":{"action":"run_command","value":"%clickThis%"},"hoverEvent":{"action":"show_text","value":"Previous Page"}' } - ^if %page% == %pageTotal% { - define buttonNext '"text":"%pageTotal%"' } else { - define clickNext '/%command% ' - define buttonNext '"text":"%pageTotal%","clickEvent":{"action":"run_command","value":"%clickNext%"},"hoverEvent":{"action":"show_text","value":"Next Page"}' } - ^define prefix '"text":"<&2>|<&sp><&sp><&sp><&6>"' - ^define tpad '"text":"<&9.pad_right[%pad%].with[ ]>"' - ^define p '"text":"<&9><&o>Page<&sp>"' - ^define o '"text":"<&9><&o><&sp>of<&sp>"' - ^narrate "<&2>|<&pipe.pad_left[].with[-]>" - ^execute as_server 'tellraw {"text":"","extra":[{%prefix%},%finalHeading%,{%tpad%},{%p%},{%buttonThis%},{%o%},{%buttonNext%}]}' - ^narrate "<&2>|" msgsBody: - ^foreach { - narrate "<&2>|<&f><&sp><&sp>" } - ^repeat ].as_int> { - narrate "<&2>|" } - ^if contains 's@%script%_Version' { - define repoVersion '' - define currentVersion '' - define vString '<&7>Version<&co> <&b>%currentVersion%' - define vPad '].add[1].mul[1.5].round>' - narrate "<&2>|<&f.pad_right[%vPad%]>%vString%" - if '%repoVersion%' != '%currentVersion%' { - define uString '<&c><&o>Repo Version<&co> <&b>%repoVersion%' - define uPad '].add[1].mul[1.5].round>' - define url 'http://one.denizenscript.com/denizen/repo/entry/' - narrate "<&2>|<&f.pad_right[%uPad%]><&c><&o>Repo Version<&co> %repoVersion%|%url%|Click to go to repo!]>" } } else { - narrate "<&2>|" } msgsFooter: - ^define authors '' - ^if { - goto 'end' } - ^define list 'li@' - ^define spacer '"text":" "' - ^define prefix '"text":"<&2>| <&f>Authors<&co> "' - ^foreach %authors% { - define text '' - define url '' - define entry '"text":"<&7>%text%","clickEvent":{"action":"open_url","value":"%url%"},"hoverEvent":{"action":"show_item","value":"{}"}' - if %loop_index% == { - define list '<&rc>]>' } else { - define list '<&rc>|<&lc><&rc>]>' } } - ^if { - execute as_server 'tellraw {"text":"","extra":[{%prefix%},]}' } else { - announce to_console "<&2>| <&f>Authors: <&7><&sp><&7>]>" } - ^mark 'end' - ^define scroll '<&2>Click <&9><&o>Page Numbers<&2> and <&9><&l>Responses<&2> to navigate' - ^define pad '].div[2].round_up>' - ^narrate "<&2><&pipe.pad_right[%pad%].with[-]>- %scroll% -<&pipe.pad_left[%pad%].with[-]>" # # END msgBoxed #-------------------------------------- # # URL Parser # # - Allow scripters to easily have clickable text to open urls, run commands, or just show messages on hover # # Example Usage: # - narrate "click <&e>this|google.com/search|<&9>click]> link" # - narrate "read the <&e>help|help|<&a>click here fool!]> docs" # - narrate "hover your mouse on the <&e>secret|<&6>gold star!]> message" # - narrate "click <&e>yes|yes|Click this]> to make your player say yes in chat" # - narrate "Give the player a <&e>Command|command|Click this]> hint" # - narrate " <&e>Suggest|Maybe say this|Click this]> something for your player to type" # msgParser: type: world debug: false events: on player receives message: - if !@<&ss><&chr[260f]>]> { - queue clear } - define message '].before_last[<&rb>]>' - foreach '].before_last[<&rc>].split_by[<&rc>,<&lc>].escape_contents>': - define element '' - foreach ',<&dq>]>': - define node '' - define attribute ']>' - define aValue ']>' - if '' != '<&dq>text<&dq>' { - foreach next } - if !<&ss>@<&ss><&chr[260f]>]> { - foreach next } - define split '<&ss>@<&ss><&chr[260f]>].split_by[_-_]>' - define type '' - define text '' - choose '': - case 'URL': - define url 'http<&co>//' - define hover '].replace[\\u0026].with[&].replace[\u0026].with[&].unescaped>' - define button '"text":"%text%","clickEvent":{"action":"open_url","value":"%url%"},"hoverEvent":{"action":"show_text","value":"%hover%"}' - case 'command': - define command '/' - define hover '].replace[\\u0026].with[&].replace[\u0026].with[&].unescaped>' - define button '"text":"%text%","clickEvent":{"action":"run_command","value":"%command%"},"hoverEvent":{"action":"show_text","value":"%hover%"}' - case 'hint': - define command '/' - define hover '].replace[\\u0026].with[&].replace[\u0026].with[&].unescaped>' - define button '"text":"%text%","clickEvent":{"action":"suggest_command","value":"%command%"},"hoverEvent":{"action":"show_text","value":"%hover%"}' - case 'suggest': - define command '' - define hover '].replace[\\u0026].with[&].replace[\u0026].with[&].unescaped>' - define button '"text":"%text%","clickEvent":{"action":"suggest_command","value":"%command%"},"hoverEvent":{"action":"show_text","value":"%hover%"}' - case 'chat': - define chat '' - define hover '].replace[\\u0026].with[&].replace[\u0026].with[&].unescaped>' - define button '"text":"%text%","clickEvent":{"action":"run_command","value":"%chat%"},"hoverEvent":{"action":"show_text","value":"%hover%"}' - case 'hover': - define hover '].replace[\\u0026].with[&].replace[\u0026].with[&].unescaped>' - define button '"text":"%text%","hoverEvent":{"action":"show_text","value":"%hover%"}' - define message '%button%' - determine 'RAW_JSON:{"extra":[],"text":""}' # # END URL Parser #-------------------------------------- # # Line Wrapping utility # # - Turn a long string into a list of smaller strings # Treats the <&nl> symbol as intended # Preserves the last color used from the previous line # # Usage: # lineWrap: type: procedure definitions: string|targetLen debug: false script: - define cleanString 'li@' - foreach '': - if '%value%' == '' { - define cleanString '' - foreach next } - define word '%value%' - if !<&ss>@<&ss><&chr[260f]>]> { - define cleanString ']>' - foreach next } - define text '<&ss>@<&ss><&chr[260f]>].split_by[_-_].get[2].replace[\u0026].with[&].unescaped>' - define %loop_index% '<&bs>u0026]>' - define cleanString '' - if { - determine 'li@ ' } - define cleanString '' - define stringLen '' - if %stringLen% <= %targetLen% { - define finalString 'li@' - foreach '' { - if { - define finalString ']>' } else { - if '%value%' == '' { - define value '&sp' } - define finalString '' } } - determine '].as_list>' } - define c '<&f>' - define lines 'li@' - while '': - define low '' - define hi '].as_int||%targetLen%>' - define pass '' - if == %stringLen% { - define lines ']>' - while stop } else { - define brake ']>]:]>||]>>' - define increment '' - define passtrim '%c%]:%brake%||>]>' - define lines ']||>' - define c '>' - define stringLen '' } - if { - while stop } - define i '0' - define finalLines 'li@' - foreach '': - define finalString 'li@' - foreach '': - define i '' - if { - define finalString ']>' } else { - if '%value%' == '' { - define value '<&sp>' } - define finalString '' } - define finalLines ']>]>' - determine '' # # END lineWrap #-------------------------------------- # # Pagination utility # # - Return a list of entries for display on a specific page # Pagination simply takes a list of entries, and the desired page length and # returns only the entries for the desired page number. # # Usage: # pagination: type: procedure definitions: page|pageSize debug: false script: - define entries '' - foreach 'li@page|pageSize': - define %value% '' - if { - define page '1' } else { - define page '' } - define pages '].round_up||1>' - if { - define page '%pages%' } - define highNumber '].as_int>' - define lowNumber '].as_int>' - determine 'li@%page%|%pages%|' # # END pagination #-------------------------------------- # # Paragraph utility # # Turns a list of entries into a list of lines limited in length. # - Useful if you want to limit total page size not just entries per page. # # Usage: # paragraph: type: procedure definitions: lineLen debug: false script: - define paragraphs '' - define lineLen '' - define lineLen ']>]:%lineLen%||44>' - define result 'li@' - foreach '' { - define lines '|]>' - foreach '' { - define result ']>' } } - determine '' # # Put this inside the second foreach just before it closes to automatically # insert a newline at the end of each paragraph. # - define result ']>' # # END paragraph #-------------------------------------- # # Center Justified Utility # # Returns your text center justified based on target line length # # Usage: # msgCentered: type: procedure definitions: lineLen|string debug: false script: - define pad '].div[2].as_int>' - determine '<&6.pad_right[%pad%].with[<&sp>]><&6.pad_right[%pad%].with[<&sp>]>' # # END msgCentered #-------------------------------------- # # Trimmed Message Utility # # Returns your text trimmed to fit a specified length. # Extra text is shown as an elipsis... # # Usage: # msgTrim: type: procedure definitions: lineLen|string debug: false script: - if > %linelen% { - determine '].escaped>...' } - determine '%string%' # # END msgTrim #-------------------------------------- # # URL Message Formatter # # Returns your text formatted for automatic conversion to JSON. # # Usage: # msgUrl: type: procedure definitions: display|url|hover debug: false script: - determine '<&r><&ss>@<&ss><&chr[260f]>URL_-__-__-_<&r>' # # END msgUrl #-------------------------------------- # # Command Message Formatter # # Returns your text formatted for automatic conversion to JSON. # # Usage: # msgCommand: type: procedure definitions: display|command|hover debug: false script: - determine '<&r><&ss>@<&ss><&chr[260f]>command_-__-__-_<&r>' # # END msgCommand #-------------------------------------- # # Hover Message Formatter # # Returns your text formatted for automatic conversion to JSON. # # Usage: # msgHover: type: procedure definitions: display|hover debug: false script: - determine '<&r><&ss>@<&ss><&chr[260f]>hover_-__-_<&r>' # # END msgHover #-------------------------------------- # # Hint Message Formatter # # Returns your text formatted for automatic conversion to JSON. # # Usage: # msgHint: type: procedure definitions: display|hint|hover debug: false script: - determine '<&r><&ss>@<&ss><&chr[260f]>hint_-__-__-_<&r>' # # END msgHint #-------------------------------------- # # Suggest Message Formatter # # Returns your text formatted for automatic conversion to JSON. # # Usage: # msgSuggest: type: procedure definitions: display|suggest|hover debug: false script: - determine '<&r><&ss>@<&ss><&chr[260f]>suggest_-__-__-_<&r>' # # END msgSuggest #-------------------------------------- # # Chat Message Formatter # # Returns your text formatted for automatic conversion to JSON. # This will make it so that a player chats the message they click. # Good for situations where an NPC is expecting chat input. # # Usage: # msgChat: type: procedure definitions: display|chat|hover debug: false script: - determine '<&r><&ss>@<&ss><&chr[260f]>chat_-__-__-_<&r>' # # END msgChat # # # ################################################################################