You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

215 lines
8.6 KiB

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE muclient>
<!-- Saved on Wednesday, March 09, 2022, 11:04 AM -->
<!-- MuClient version 5.07-pre -->
<muclient>
<plugin name="NoteExtender" author="Crowley" id="c49e43d9dce931263263088b" language="Lua" purpose="Note output and hyperlinks" save_state="y" date_written="2022-03-09 11:02:09" requires="5.07" version="1.0" sequence="10">
</plugin>
<!-- Aliases -->
<aliases>
<alias match="^(note?(?: read(?: \d+| last| again)?)?)$" enabled="y" regexp="y" script="startNoteRead" sequence="100">
</alias>
<alias match="^notewin (on|off|show|hide|clear|help)$" enabled="y" regexp="y" ignore_case="y" script="toggleNoteWin" sequence="100">
</alias>
<alias match="^(note?\s?(?:list(?:\s\d+)?|unread|to\s\w+|from\s\w+|subj\s.+)?)$" enabled="y" regexp="y" script="startNoteList" sequence="100">
</alias>
</aliases>
<script>
<![CDATA[
local extras = require "aard_lua_extras"
require "gmcphelper"
local snapshotV = tonumber(extras.PackageVersion())
local prefix = GetAlphaOption("script_prefix")
if (snapshotV< 2245) or (snapshotV < 2252 and tonumber(gmcp("char.base.level")) > 201) then
ColourNote("white", "blue", "Sorry, your snapshot of the AardMUSH package is not compatible for your level and you will not be able to use this script. Please update your snapshot of the AardMUSH package to use this plugin. Unloading plugin to prevent issues.")
Execute(prefix .. 'DoAfterSpecial(1, "UnloadPlugin(\'' .. GetPluginID() .. '\')", sendto.script)')
else
require "wrapped_captures"
end
require 'themed_miniwindows'
fontName = GetAlphaOption("output_font_name")
fontHeight = GetOption("output_font_height")
if not GetVariable("noteShow") then
SetVariable("noteShow", "true")
noteShow = GetVariable("noteShow")
else
noteShow = GetVariable("noteShow")
end
function OnPluginInstall()
NotesWin = ThemedTextWindow(
"Notes", -- string, required, a unique identifier for this window
200, -- integer, required, where to put it if the player hasn't moved it
200, -- integer, required, where to put it if the player hasn't moved it
840, -- integer, required, how big to make it if the player hasn't moved it
500, -- integer, required, how big to make it if the player hasn't moved it
"Note", -- string, optional (nil means no titlebar), text to put into the title
"center", -- string, optional (default is "center"), "left", "center", or "right"
true, -- boolean, optional (default is false), true adds a close button in the top left
true, -- boolean, optional (default is false), make the window resizeable
true, -- boolean, optional (default is false), add a scrollbar and mousewheel scrolling
true, -- boolean, optional (default is false), make the text selectable
true, -- boolean, optional (default is false), make the text copyable via right-click
true, -- boolean, optional (default is false), turn detected URLs into clickable links
true, -- boolean, optional (default is false), automatically wrap text lines that are too wide
fontName, -- string, optional (default is Dina), override the title font name
fontHeight, -- integer, optional (default is 10), override the title font size
fontName, -- string, optional (default is Dina), override the body text font name
fontHeight, -- integer, optional (default is 10), override the body text font size
1000, -- integer, optional (default is 1000), maximum number of text lines to keep
5, -- integer, optional (default is 5 pixels), space between text and miniwindow frame
true -- boolean, optional (default is false), true will prevent the window from appearing until you call :show() on it
)
end
function startNoteRead(name, line, wildcards)
local param = wildcards[1]
if noteShow == "true" then
if not WindowInfo("Notes", 1) then OnPluginInstall() end
NotesWin:clear(false)
Capture.untagged_output(param, true, true, true, addToWindow, false)
else
Send(param)
end
end
function startNoteList(name, line, wildcards)
local param = wildcards[1]
Capture.untagged_output(param, true, true, true, hyperlinknotes, false)
end
function findBoundaries(tbl)
local tildeStr = string.rep("~", 79)
for indexStart,v in ipairs(tbl) do
if v[1].text == tildeStr or v[1].text:find("No more new") then
for indexEnd = #tbl, 1, -1 do
if tbl[indexEnd][1].text == tildeStr or tbl[indexEnd][1].text:find("There are no") or tbl[indexEnd][1].text:find("Changed") then
table.move(tbl, indexStart, indexEnd, 1)
local len = indexEnd - indexStart + 1
table.move(tbl, #tbl + 1, #tbl*2 - len, len + 1)
return tbl
end
end
end
end
return tbl
end
function addToWindow(lines)
local lines = findBoundaries(lines)
local strippedLine = strip_colours_from_styles(lines)
post = 0
if strippedLine:find("Forum") and not post == 0 then
post = strippedLine:match("#(%d+)")
end
NotesWin:clear(false)
NotesWin:add_text(lines, false)
NotesWin:fit_contents(850, 500)
NotesWin:set_scroll(1)
NotesWin:show()
end
function shouldHyperlink(str, tbl)
local hyperTbl = {}
local youShould = false
table.insert(hyperTbl, TruncateStyles(tbl, 2, 7))
table.insert(hyperTbl, TruncateStyles(tbl, 23, 34))
table.insert(hyperTbl, TruncateStyles(tbl, 37, 72))
for _,v in ipairs(hyperTbl) do
for _,w in ipairs(v) do
if Hash(w.text):find(Hash(str)) then
youShould = true
break
end
end
end
return youShould
end
function hyperText(tbl)
local retStr = ""
for _, v in ipairs(tbl) do
retStr = retStr .. v.text
end
return retStr
end
function hyperlinknotes(lines)
local postNo
local author
local subj
for i,v in ipairs(lines) do
if i == 1 then
Simulate(stylesToANSI(v) .. ColoursToANSI(" @C(Clickable posts)") .. "\n")
elseif i <= 4 or i == #lines then
Simulate(stylesToANSI(v) .. "\n")
elseif i < #lines then
--postNo = v[2].text:gsub(" ", "")
postNo = hyperText(TruncateStyles(v, 2, 7)):gsub(" ", "")
author = hyperText(TruncateStyles(v, 23, 34)):gsub("%s+$", "")
subject = hyperText(TruncateStyles(v, 37, 72)):gsub("%s+$", "")
for j,k in ipairs(v) do
if shouldHyperlink(k.text, v) then
Hyperlink(prefix .. "Execute('note read " .. postNo .. "')", k.text, "Post #" .. postNo .. ": " .. subject .. " (" .. author .. ")", RGBColourToName(k.textcolour), RGBColourToName(k.backcolour), false, true)
else
ColourTell(RGBColourToName(k.textcolour), RGBColourToName(k.backcolour), k.text)
end
end
Note("")
end
end
end
function toggleNoteWin(name, line, wildcards)
local noteOpt = wildcards[1]
if noteOpt == "on" then
noteShow = "true"
SetVariable("noteShow", noteShow)
ColourNote("white", "blue", "Note Extender: Displaying notes in window.")
elseif noteOpt == "off" then
noteShow = "false"
SetVariable("noteShow", noteShow)
ColourNote("white", "blue", "Note Extender: Displaying notes in main output.")
elseif noteOpt == "show" then
NotesWin:fit_contents(850, 500)
NotesWin:show()
elseif noteOpt == "hide" then
NotesWin:hide()
elseif noteOpt == "clear" then
NotesWin:clear(false)
NotesWin:hide()
elseif noteOpt == "help" then
onHelp()
end
end
function onHelp()
ColourNote("yellow", "", "Basic commands:")
ColourNote("orange", "", string.format("%-30s - %s", "notewin <on|off>", "Toggles where notes are displayed (window or output)."))
ColourNote("orange", "", string.format("%s-30s - %s", "notewin <show|hide>", "Shows or hides the note window."))
ColourNote("orange", "", string.format("%-30s - %s", "notewin clear", "Clears the note window of existing content."))
end
]]>
</script>
</muclient>