Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?xml version="1.0" encoding="iso-8859-1"?>
- <!DOCTYPE muclient>
- <!-- Bits of this plugin and ideas were borrowed and remixed from the MUSHclient community. http://www.gammon.com.au/forum/?id=9385 and others. -->
- <!-- Modifications for Aardwolf and extra awesome sauce added by Fiendish with help from Orogan -->
- <!-- Adapated by Nick Gammon for Smaug and similar MUDs -->
- <muclient>
- <plugin
- name="Miniwindow"
- author="Fiendish"
- id="565dae21eb816a2fdb8d50f9"
- language="Lua"
- purpose="Move chats to a miniwindow"
- date_written="2010-04-04"
- date_modified="2011-01-05"
- requires="4.52"
- version="2.4"
- save_state="y"
- >
- <description trim="y">
- USAGE:
- chats echo on : echo chats in main window
- chats echo off : do not echo chats
- chats show : show chats window
- chats hide : hide chats window
- LH-click a line to copy it to the clipboard
- RH-click main window to see menu of options
- Click title bar to drag window.
- </description>
- </plugin>
- <triggers>
- <trigger
- enabled="y"
- match="(Dr. Thaung|Ragnarok the Flame Salamander|Minut|Holly|Grim|Dr. Briefs|Happy Tourist|Satan City Tour Guide|Capsule Corp Reclamation Droid|Jamaican Drug Dealer|Ancient Nexus Guardian|Old Hag|Head Postmaster|Bio Truffle Scientist|Fiera the Executioner|Malevolenia|Malevolenia the Black Widow|Avatar of Hate|Avatar of Fear|Avatar of Rage|Blix|Advanced Fighter|Average Fighter) (says|mutters|exclaims|asks), "
- regexp="y"
- script=" "
- sequence="1"
- >
- </trigger>
- <trigger
- enabled="y"
- match="[Infinity] ::*::"
- script="chats"
- omit_from_output="y"
- sequence="100"
- ></trigger>
- <trigger
- enabled="y"
- match="^\[Auction\:"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="\[HARDCORE\]"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^\-\<OOC\>\-"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="(tells you|you tell)"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="You Have 2 minutes to 'say' the three numbers displayed above!"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)\[(.*?)\]\: (.*?)$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="You tell"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="You say"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)\[Info\]\: (.*?)$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)[A-Za-z]+ (say|chat|mutter||\[Newbie\]|exclaim|ask|yell|\[OOC\]|sends a scouter transmission to|\(Holler\)|\(Shout\)|\(Music\)|\(Roleplay\)|\(Quote\)|\(Congrat\)|\(Quest\)|OOC say|)s, \'(.*?)\'$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)\[A-Za-z]+ exclaims, \'(.*?)\'$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)[A-Za-z]+ tells the group, \'(.*?)\'$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)\[A-Za-z]+ (exclaim)s, \'(.*?)\!'$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)\[A-Za-z]+ asks, \'(.*?)\?'$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)\(QUESTION\) (.*?)\:(.*?)$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)\[FreedomOfSpeech\] (.*?)$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)\[TRAFFIC\-(.*?)\](.*?)$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)\[MuSiC\] (.*?)$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)\[RolePlay\](.*?)$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)\[RolePlay\:OOC\](.*?)$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)Auction\:(.*?)$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)\You send a transmission to (.*?)\, \'(.*?)\'$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)\>\>(.*?)\<\<(.*?)$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)\You whisper to (.*?)\, \'(.*?)\'$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)[A-Za-z]+ sends a transmission to you, \'(.*?)\'$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)[A-Za-z]+ whispers to you, \'(.*?)\'$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)\[TRAFFIC\-(.*?)\](.*?)$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)\/TRIVIA\/\/(.*?)$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)\-\=\[Misc\|(.*?)$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)\{WARTALK\|(.*?)$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?) says (.*?)$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?) \((.*?)\)\: (.*?)$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="You RP Chat\: \'(.*?)\'$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?) RP Chats\: \'(.*?)\'$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="\[Admin\] (.*?)$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="\[Wiznet\] (.*?)$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(?:\[Pl\:[\d\,\-\=\!]+\]\[Ki\:[\d\,\-\=\!]+\]\[\d+\% EXP\]\[\w+\: \d+\%\](?:\[HT\])?(?:\[FM\])?(?:\[K\])?)?(?:(?:You get|[\.\-\'\!\w\s]+ (drops)) (Essence of (Fate|Power|Mind)|(?:Namekian )?(One|Two|Three|Four|Five|Six|Seven) Star Dragonball|Battle Token|Gauntlet of Evil|(Destiny|Forever|Eternal) Essence)(?: on the ground before dying)?|RANDOM BOT CHECK|You have 2 minutes to \'say\' the three numbers displayed above|You feel your body tense as the dull light of the Makyo Star begins shining down on to you\. Energy from the star begins penetrating your body\, as your cells begin reacting violently\, each erupting with power as your body begins to twist and transform\. Your bones begin to crack and reshape themselves as your muscles bulge out with incredible force\, as a dark aura begins swirling about you\. A final explosion of power comes from within you\, sending debris flying as your body now stands fully empowered by the Makyo Star\. |You look at the moon and begin to lose control and rage takes over your mind\, you see nothing but red and begin to transform\, you begin to grow and hair develops all over your body\! You quickly transform into a large Oozaru|Your body starts to shake as a dark aura consumes your body\. You look in the sky and notice the Vanished Moon coming into orbit\. Your eyes quiver as everything seems to move in slow motion as your power reaches its max)\!?\.?$"
- regexp="y"
- script="chats"
- name="rare_drop"
- keep_evaluating="y"
- sequence="5"
- >
- </trigger>
- <trigger
- enabled="y"
- ignore_case="y"
- keep_evaluating="y"
- match="^(?:\[Pl\:[\d\,\-\=\!]+\]\[Ki\:[\d\,\-\=\!]+\]\[\d+\% EXP\]\[\w+\: \d+\%\](?:\[HT\])?(?:\[FM\])?(?:\[K\])?)?(\[Mental Awareness Bonus \+\d+ Ki\]|\[Knowledge Bonus \+\d+ Lp\]|\[Inner Strength Bonus \+\d+ Pl\]|\[Damroll Bonus \+\d+\]|\[Hitroll Bonus \+\d+\])$"
- regexp="y"
- name="rare_bonus"
- script="chats"
- sequence="5"
- >
- </trigger>
- <trigger
- enabled="y"
- match="(?:\[Pl\:[\d\,\-\=\!]+\]\[Ki\:[\d\,\-\=\!]+\]\[\d+\% EXP\]\[\w+\: \d+\%\](?:\[HT\])?(?:\[FM\])?(?:\[K\])?)?(?:\w+ throws? \w+ dice and gets?\.\.\.|\[\d+\] \-\=\- \[\d+\] +\((?:Snake Eyes|Total\: \d+)\))"
- regexp="y"
- script="chats"
- keep_evaluating="y"
- sequence="5"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)\You (say|chat|exclaim|mutter|ask|yell|\[Newbie\]|\[OOC\]|send a scouter transmission to|\(Holler\)|\(Shout\)|\(Music\)|\(Roleplay\)|\(Quote\)|\(Congrat\)|\(Quest\)|OOC say|tell the group), \'(.*?)\'$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- <trigger
- enabled="y"
- match="^(.*?)\SNET(.*?)$"
- regexp="y"
- script="chats"
- sequence="100"
- >
- </trigger>
- </triggers>
- <aliases>
- <alias
- script="chat_echo"
- match="^chats echo( on| off)?$"
- enabled="y"
- regexp="y"
- sequence="100"
- ignore_case="y"
- ></alias>
- <alias
- script="chat_show"
- match="chats show"
- enabled="y"
- sequence="100"
- ignore_case="y"
- ></alias>
- <alias
- script="chat_hide"
- match="chats hide"
- enabled="y"
- sequence="100"
- ignore_case="y"
- ></alias>
- </aliases>
- <script>
- <![CDATA[
- require "movewindow" -- load the movewindow.lua module
- require "copytable"
- BODY_FONT_NAME = "Arial"
- BODY_FONT_SIZE = 9
- SCROLL_BAR_WIDTH = 15
- MAX_LINES = 10000 -- how many lines to store in scrollback
- -- date_format = "[%d %b %H:%M:%S] " -- [30 Aug 13:29:49] date and time 24 hour
- -- date_format = "[%d %b %I:%M:%S%p] " -- [30 Aug 01:20:12PM] date and time 12 hour
- -- date_format = "[%H:%M:%S] " -- [13:29:08] time 24 hour
- -- date_format = "[%X] " -- [1:22:06 PM] time 12 hour
- TIMESTAMP_TEXT_COLOUR = "white"
- TIMESTAMP_BACK_COLOUR = "black"
- -- doing it this way makes them default to true the first time around
- timestamp = not (GetVariable("timestamp") == "false")
- echo = not (GetVariable("echo") == "false")
- date_format = GetVariable("date_format")
- WINDOW_WIDTH = tonumber(GetVariable("WINDOW_WIDTH"))
- WINDOW_HEIGHT = tonumber(GetVariable("WINDOW_HEIGHT"))
- -- offset of text from edge
- TEXT_INSET = 5
- -- where to store the chat line
- lines = {} -- table of recent chat lines
- rawlines = {}
- lineStart = ""
- lineEnd = ""
- WINDOW_COLUMNS = ""
- WINDOW_LINES = ""
- theme = {
- WINDOW_BACKGROUND = ColourNameToRGB ("#000000"), -- for miniwindow body
- WINDOW_BORDER = ColourNameToRGB("#E8E8E8"), -- for miniwindow body
- HIGHLIGHT=ColourNameToRGB("#FFFFFF"), -- for 3D surfaces
- FACE=ColourNameToRGB("#D4D0C8"), -- for 3D surfaces
- INNERSHADOW=ColourNameToRGB("#808080"), -- for 3D surfaces
- OUTERSHADOW = ColourNameToRGB("#404040"), -- for 3D surfaces
- BACK_FACE = ColourNameToRGB ("#E8E8E8"), -- for contrasting details
- DETAIL = ColourNameToRGB ("#000000"), -- for contrasting details
- TITLE_HEIGHT = 17, -- for miniwindow title area
- SUBTITLE_HEIGHT = 17, -- for miniwindow title area
- TITLE_FONT_NAME = "Dina", -- for miniwindow title area
- TITLE_FONT_SIZE = 8 -- for miniwindow title area
- } -- end theme table
- -- replacement for WindowRectOp action 5, which allows for a 3D look while maintaining color theme
- -- Requires global theme.HIGHLIGHT, theme.FACE, theme.INNERSHADOW, and theme.OUTERSHADOW rgb colors to be set.
- function DrawThemed3DRect(Window, left, top, right, bottom)
- WindowRectOp(Window, miniwin.rect_fill, left, top, right, bottom, theme.FACE)
- WindowLine(Window, left, top, right, top, theme.HIGHLIGHT,
- miniwin.pen_solid + miniwin.pen_endcap_flat, 1)
- WindowLine(Window, left, top, left, bottom, theme.HIGHLIGHT,
- miniwin.pen_solid + miniwin.pen_endcap_flat, 1)
- WindowLine(Window, left, bottom-2, right, bottom-2, theme.INNERSHADOW,
- miniwin.pen_solid + miniwin.pen_endcap_flat, 1)
- WindowLine(Window, right-2, top, right-2, bottom-2, theme.INNERSHADOW,
- miniwin.pen_solid + miniwin.pen_endcap_flat, 1)
- WindowLine(Window, left, bottom-1, right, bottom-1, theme.OUTERSHADOW,
- miniwin.pen_solid + miniwin.pen_endcap_flat, 1)
- WindowLine(Window, right-1, top, right-1, bottom-1, theme.OUTERSHADOW,
- miniwin.pen_solid + miniwin.pen_endcap_flat, 1)
- end
- function DrawThemedResizeTag(Window, x1, y1, size)
- local x2, y2 = x1+size, y1+size
- DrawThemed3DRect(Window, x1, y1, x2, y2)
- local m = 2
- local n = 2
- while (x1+m+2 <= x2-3 and y1+n+1 <= y2-4) do
- WindowLine(Window, x1+m+1, y2-4, x2-3, y1+n, theme.HIGHLIGHT,
- miniwin.pen_solid, 1)
- WindowLine(Window, x1+m+2, y2-4, x2-3, y1+n+1, theme.INNERSHADOW,
- miniwin.pen_solid, 1)
- m = m+3
- n = n+3
- end
- end -- function DrawThemedResizeTag
- Win = GetPluginID()
- font_height = ""
- line_height = ""
- windowinfo = ""
- startx = ""
- starty = ""
- function ResizeMoveCallback()
- posx, posy = WindowInfo (Win, 17), WindowInfo (Win, 18)
- if (WindowTextWidth(Win, "titlefont"..Win, "WWWCOMMUNICATION")+2*SCROLL_BAR_WIDTH <= WINDOW_WIDTH+posx-startx) then
- WINDOW_WIDTH = WINDOW_WIDTH+posx-startx
- startx = posx
- end -- if
- if (3*SCROLL_BAR_WIDTH+10+line_height+theme.TITLE_HEIGHT <= WINDOW_HEIGHT+posy-starty) then
- WINDOW_HEIGHT = WINDOW_HEIGHT+posy-starty
- starty = posy
- end -- if
- init(false)
- end -- function ResizeMoveCallback
- function ResizeReleaseCallback()
- WINDOW_HEIGHT = theme.TITLE_HEIGHT+(line_height*(WINDOW_LINES-1))+3
- init(true)
- end -- ResizeReleaseCallback
- function OnPluginInstall()
- -- Dummy window to get font characteristics
- check (WindowCreate (Win, 0, 0, 1, 1, 0, 0, theme.WINDOW_BACKGROUND) )
- check (WindowFont(Win, "bodyfont"..Win, BODY_FONT_NAME, BODY_FONT_SIZE))
- check (WindowFont(Win, "titlefont"..Win, theme.TITLE_FONT_NAME, theme.TITLE_FONT_SIZE))
- font_height = WindowFontInfo (Win, "bodyfont"..Win, 1) - WindowFontInfo (Win, "bodyfont"..Win, 4) + 1
- line_height = font_height+1
- font_width = WindowTextWidth (Win, "bodyfont"..Win, "W")
- -- install the window movement handler, get back the window position
- windowinfo = movewindow.install (Win, miniwin.pos_top_right, miniwin.create_absolute_location, true)
- -- check for Echo/Timestamp/date_format/window size (in pixels) variables, if not there, set them
- if date_format == nil then
- date_format = "[%d %b %H:%M:%S] "
- end -- if
- if WINDOW_WIDTH == nil then
- WINDOW_WIDTH = (font_width*80)+SCROLL_BAR_WIDTH -- 80 columns
- end
- if WINDOW_HEIGHT == nil then
- WINDOW_HEIGHT = theme.TITLE_HEIGHT+(line_height*6)+2 -- 6 lines
- end -- if
- init(true)
- OnPluginEnable () -- do initialization stuff
- end -- function OnPluginInstall
- function init(firstTime)
- -- how many lines and columns will fit?
- WINDOW_LINES = math.ceil((WINDOW_HEIGHT-theme.TITLE_HEIGHT)/line_height)
- WINDOW_COLUMNS = math.ceil((WINDOW_WIDTH-SCROLL_BAR_WIDTH)/font_width)
- if firstTime then
- WindowCreate(Win, windowinfo.window_left, windowinfo.window_top, WINDOW_WIDTH, WINDOW_HEIGHT, windowinfo.window_mode, windowinfo.window_flags, theme.WINDOW_BACKGROUND)
- -- catch for right-click menu and line selection
- WindowAddHotspot(Win, "textarea", 0, theme.TITLE_HEIGHT, WINDOW_WIDTH-SCROLL_BAR_WIDTH,0,
- "", "", "MouseDown", "CancelMouseDown", "MouseUp", "",
- miniwin.cursor_ibeam, 0)
- -- add the drag handler so they can move the window around
- movewindow.add_drag_handler (Win, 0, 0, 0, theme.TITLE_HEIGHT)
- -- scroll bar up/down buttons
- WindowAddHotspot(Win, "up", WINDOW_WIDTH-SCROLL_BAR_WIDTH, theme.TITLE_HEIGHT, 0, theme.TITLE_HEIGHT+SCROLL_BAR_WIDTH,
- "MouseOver", "CancelMouseOver", "MouseDown", "CancelMouseDown", "MouseUp", "",
- miniwin.cursor_hand, 0)
- WindowAddHotspot(Win, "down", WINDOW_WIDTH-SCROLL_BAR_WIDTH, WINDOW_HEIGHT-(2*SCROLL_BAR_WIDTH), 0, WINDOW_HEIGHT-SCROLL_BAR_WIDTH,
- "MouseOver", "CancelMouseOver", "MouseDown", "CancelMouseDown", "MouseUp", "",
- miniwin.cursor_hand, 0)
- -- add the resize widget hotspot
- WindowAddHotspot(Win, "resizer", WINDOW_WIDTH-SCROLL_BAR_WIDTH, WINDOW_HEIGHT-SCROLL_BAR_WIDTH, WINDOW_WIDTH, WINDOW_HEIGHT,
- "MouseOver", "CancelMouseOver", "MouseDown", "CancelMouseDown", "MouseUp", "",
- miniwin.cursor_nw_se_arrow, 0)
- WindowDragHandler(Win, "resizer", "ResizeMoveCallback", "ResizeReleaseCallback", 0)
- else
- WindowResize(Win, WINDOW_WIDTH, WINDOW_HEIGHT, theme.WINDOW_BACKGROUND)
- WindowMoveHotspot(Win, "textarea", 0, theme.TITLE_HEIGHT, WINDOW_WIDTH-SCROLL_BAR_WIDTH, 0)
- WindowMoveHotspot(Win, "up", WINDOW_WIDTH-SCROLL_BAR_WIDTH, theme.TITLE_HEIGHT, 0, theme.TITLE_HEIGHT+SCROLL_BAR_WIDTH)
- WindowMoveHotspot(Win, "down", WINDOW_WIDTH-SCROLL_BAR_WIDTH, WINDOW_HEIGHT-(2*SCROLL_BAR_WIDTH), 0, WINDOW_HEIGHT-SCROLL_BAR_WIDTH)
- WindowMoveHotspot(Win, "resizer", WINDOW_WIDTH-SCROLL_BAR_WIDTH, WINDOW_HEIGHT-SCROLL_BAR_WIDTH, WINDOW_WIDTH, 0)
- end -- if
- WindowShow(Win, true)
- if (firstTime == true) then
- lines = {}
- for _,styles in ipairs(rawlines) do
- fillBuffer(styles)
- end -- for each line
- end -- if
- lineStart = math.max(1, #lines-WINDOW_LINES+2)
- lineEnd = math.max(1, #lines)
- refresh()
- end -- function init
- function OnPluginClose ()
- -- if enabled
- if GetPluginInfo (GetPluginID(), 17) then
- OnPluginDisable()
- end -- if enabled
- end -- function OnPluginClose
- function OnPluginEnable ()
- WindowShow (Win, true)
- end -- function OnPluginEnable
- function OnPluginSaveState ()
- -- save window current location for next time
- SetVariable ("enabled", tostring (GetPluginInfo (GetPluginID(), 17)))
- movewindow.save_state (Win)
- -- save echo/timestamp status
- SetVariable ("echo", tostring (echo))
- SetVariable ("timestamp", tostring (timestamp))
- SetVariable("date_format", date_format)
- SetVariable("WINDOW_WIDTH", WINDOW_WIDTH)
- SetVariable("WINDOW_HEIGHT", WINDOW_HEIGHT)
- end -- function OnPluginSaveState
- function OnPluginDisable ()
- WindowShow( Win, false )
- end -- function OnPluginDisable
- -- display one line
- function Display_Line (line, styles)
- local left = TEXT_INSET
- local top = theme.TITLE_HEIGHT + (line * line_height) + 1
- local bottom = top + line_height
- local font = "bodyfont" .. Win
- if backfill then
- WindowRectOp (Win, miniwin.rect_fill, 1, top, WINDOW_WIDTH - SCROLL_BAR_WIDTH, bottom, ColourNameToRGB("#333333"))
- end -- backfill
- if (styles) then
- for _, style in ipairs (styles) do
- local width = WindowTextWidth (Win, font, style.text) -- get width of text
- local right = left + width
- WindowRectOp (Win, miniwin.rect_fill, left, top, right, bottom, style.backcolour) -- draw background
- WindowText (Win, font, style.text, left, top, 0, 0, style.textcolour) -- draw text
- left = left + width -- advance horizontally
- end -- for each style run
- end -- if styles
- end -- Display_Line
- -- display all visible lines
- function writeLines()
- for count = lineStart, lineEnd do
- Display_Line( count-lineStart, lines[count][1], false )
- end -- for each line
- Redraw()
- end -- function writeLines
- -- clear and redraw
- function refresh()
- WindowRectOp(Win, miniwin.rect_fill, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, theme.WINDOW_BACKGROUND)
- drawStuff()
- end -- function refresh
- barPos = ""
- barSize = ""
- totalSteps = ""
- function drawStuff()
- -- draw border
- WindowRectOp (Win, miniwin.rect_frame, 0, 0, 0, 0, theme.WINDOW_BORDER)
- -- Title bar
- DrawThemed3DRect(Win, 0, 0, WINDOW_WIDTH, theme.TITLE_HEIGHT)
- -- Title text
- WindowText(Win, "titlefont"..Win, "Chat Capture", ((WINDOW_WIDTH)-(7.5*line_height))/2, (theme.TITLE_HEIGHT-line_height)/2, WINDOW_WIDTH, theme.TITLE_HEIGHT, theme.DETAIL, false)
- if #lines >= 1 then
- writeLines()
- end -- if
- -- Scrollbar base
- WindowRectOp(Win, miniwin.rect_fill, WINDOW_WIDTH-SCROLL_BAR_WIDTH, theme.TITLE_HEIGHT, WINDOW_WIDTH, WINDOW_HEIGHT, theme.BACK_FACE) -- scroll bar background
- WindowRectOp(Win, miniwin.rect_frame, WINDOW_WIDTH-SCROLL_BAR_WIDTH+1, SCROLL_BAR_WIDTH+theme.TITLE_HEIGHT+1, WINDOW_WIDTH-1, WINDOW_HEIGHT-(2*SCROLL_BAR_WIDTH)-1, theme.DETAIL) -- scroll bar background inset rectangle
- DrawThemed3DRect(Win, WINDOW_WIDTH-SCROLL_BAR_WIDTH, theme.TITLE_HEIGHT, WINDOW_WIDTH, theme.TITLE_HEIGHT+SCROLL_BAR_WIDTH) -- top scroll button
- DrawThemed3DRect(Win, WINDOW_WIDTH-SCROLL_BAR_WIDTH, WINDOW_HEIGHT-(SCROLL_BAR_WIDTH*2), WINDOW_WIDTH, WINDOW_HEIGHT-SCROLL_BAR_WIDTH) -- bottom scroll button
- -- draw triangle in up button
- points = string.format ("%i,%i,%i,%i,%i,%i", (WINDOW_WIDTH-SCROLL_BAR_WIDTH)+2, theme.TITLE_HEIGHT+8,(WINDOW_WIDTH-SCROLL_BAR_WIDTH)+6, theme.TITLE_HEIGHT+4,(WINDOW_WIDTH-SCROLL_BAR_WIDTH)+10, theme.TITLE_HEIGHT+8)
- WindowPolygon (Win, points,
- theme.DETAIL, miniwin.pen_solid, 1, -- pen (solid, width 1)
- theme.DETAIL, miniwin.brush_solid, --brush (solid)
- true, --close
- false) --alt fill
- -- draw triangle in down button
- points = string.format ("%i,%i,%i,%i,%i,%i", (WINDOW_WIDTH-SCROLL_BAR_WIDTH)+2, (WINDOW_HEIGHT-SCROLL_BAR_WIDTH)-10,(WINDOW_WIDTH-SCROLL_BAR_WIDTH)+6, (WINDOW_HEIGHT-SCROLL_BAR_WIDTH)-6, (WINDOW_WIDTH-SCROLL_BAR_WIDTH)+10,(WINDOW_HEIGHT-SCROLL_BAR_WIDTH)-10)
- WindowPolygon (Win, points,
- theme.DETAIL, miniwin.pen_solid, 1, -- pen (solid, width 1)
- theme.DETAIL, miniwin.brush_solid, --brush (solid)
- true, --close
- false) --alt fill
- -- The scrollbar position indicator
- totalSteps = #lines
- if (totalSteps <= WINDOW_LINES-1) then totalSteps = 1 end
- SCROLL_BAR_HEIGHT = (WINDOW_HEIGHT-(3*SCROLL_BAR_WIDTH)-theme.TITLE_HEIGHT)
- if (not dragscrolling) then
- stepNum = lineStart-1
- barPos = SCROLL_BAR_WIDTH +theme.TITLE_HEIGHT+ ((SCROLL_BAR_HEIGHT/totalSteps) * stepNum)
- barSize = (SCROLL_BAR_HEIGHT/math.max(WINDOW_LINES-1,totalSteps)) * (WINDOW_LINES-1)
- if barSize < 10 then
- barSize = 10
- end
- if barPos+barSize > SCROLL_BAR_WIDTH+theme.TITLE_HEIGHT+SCROLL_BAR_HEIGHT then
- barPos = SCROLL_BAR_WIDTH+theme.TITLE_HEIGHT+SCROLL_BAR_HEIGHT - barSize
- end
- WindowAddHotspot(Win, "scroller", (WINDOW_WIDTH-SCROLL_BAR_WIDTH), barPos, WINDOW_WIDTH, barPos+barSize,
- "MouseOver", "CancelMouseOver", "MouseDown", "CancelMouseDown", "MouseUp", "",
- miniwin.cursor_hand, 0)
- WindowDragHandler(Win, "scroller", "ScrollerMoveCallback", "ScrollerReleaseCallback", 0)
- end -- if
- DrawThemed3DRect(Win, WINDOW_WIDTH-SCROLL_BAR_WIDTH, barPos, WINDOW_WIDTH, barPos+barSize)
- -- resizer tag
- DrawThemedResizeTag(Win, WINDOW_WIDTH-SCROLL_BAR_WIDTH, WINDOW_HEIGHT-SCROLL_BAR_WIDTH, SCROLL_BAR_WIDTH)
- Redraw()
- end -- function drawStuff
- function ScrollerMoveCallback(flags, hotspot_id)
- mouseposy = WindowInfo(Win, 18)
- windowtop = WindowInfo(Win, 2)
- barPos = math.max(mouseposy-windowtop+clickdelta, SCROLL_BAR_WIDTH+theme.TITLE_HEIGHT)
- if barPos > WINDOW_HEIGHT-(SCROLL_BAR_WIDTH*2)-barSize then
- barPos = WINDOW_HEIGHT-(SCROLL_BAR_WIDTH*2)-barSize
- lineStart = math.max(1,#lines-WINDOW_LINES+2)
- lineEnd = #lines
- else
- lineStart = math.floor((barPos-SCROLL_BAR_WIDTH-theme.TITLE_HEIGHT)/(SCROLL_BAR_HEIGHT/totalSteps)+1)
- lineEnd = math.min(lineStart + WINDOW_LINES-2, #lines)
- end -- if
- refresh()
- end -- function ScrollerMoveCallback
- function ScrollerReleaseCallback(flags, hotspot_id)
- dragscrolling = false
- refresh()
- end -- function ScrollerReleaseCallback
- function fillBuffer(rawstyles)
- local avail = 0
- local line_styles
- local beginning = true
- -- keep pulling out styles and trying to fit them on the current line
- local styles = copytable.deep (rawstyles)
- local remove = table.remove
- local insert = table.insert
- while #styles > 0 do
- if avail <= 0 then -- no room available? start new line
- -- remove first line if filled up
- if #lines >= MAX_LINES then
- remove (lines, 1)
- end -- if
- avail = WINDOW_WIDTH - (TEXT_INSET * 2) - 9
- line_styles = {}
- add_line( line_styles, beginning )
- beginning = false
- end -- line full
- -- get next style, work out how long it is
- local style = remove (styles, 1)
- local width = WindowTextWidth (Win, "bodyfont"..Win, style.text)
- -- if it fits, copy whole style in
- if width <= avail then
- insert (line_styles, style)
- avail = avail - width
- else -- otherwise, have to split style
- -- look for trailing space (work backwards). remember where space is
- local col = style.length - 1
- local split_col
- -- keep going until out of columns
- while col > 1 do
- width = WindowTextWidth (Win, "bodyfont"..Win, style.text:sub (1, col))
- if width <= avail then
- if not split_col then
- split_col = col -- in case no space found, this is where we can split
- end -- if
- -- see if space here
- if style.text:sub (col, col) == " " then
- split_col = col
- break
- end -- if space
- end -- if will now fit
- col = col - 1
- end -- while
- -- if we found a place to split, use old style, and make it shorter. Also make a copy and put the rest in that
- if split_col then
- insert (line_styles, style)
- local style_copy = copytable.shallow (style)
- style.text = style.text:sub (1, split_col)
- style.length = split_col
- style_copy.text = style_copy.text:sub (split_col + 1)
- style_copy.length = #style_copy.text
- insert (styles, 1, style_copy)
- elseif next (line_styles) == nil then
- insert (line_styles, style)
- else
- insert (styles, 1, style)
- end -- if
- avail = 0 -- now we need to wrap
- end -- if could not fit whole thing in
- end -- while we still have styles over
- end -- function fillBuffer
- -- Main capture routine
- function chats (name, line, wildcards, styles)
- -- echo in this world as well if the user wants
- if echo then
- for _, v in ipairs (styles) do
- ColourTell (RGBColourToName (v.textcolour),RGBColourToName (v.backcolour),v.text)
- end -- for each style run
- Note ("") -- wrap up line
- end -- echo wanted
- -- inject timestamp if wanted
- if timestamp then
- local tstamp = os.date (date_format)
- table.insert (styles, 1, {
- text = tstamp,
- textcolour = ColourNameToRGB (TIMESTAMP_TEXT_COLOUR),
- backcolour = ColourNameToRGB (TIMESTAMP_BACK_COLOUR),
- length = string.len (tstamp),
- style = 0,
- } )
- end -- if
- -- store the raw lines for use during resizing
- if #rawlines >= MAX_LINES then
- table.remove(rawlines, 1)
- end
- table.insert(rawlines, styles)
- fillBuffer(styles)
- refresh( )
- end -- function chats
- function add_line ( line, is_beginning_of_message )
- -- add new line
- table.insert (lines, {line, false} )
- lines[#lines][2] = is_beginning_of_message
- -- advance the count
- if #lines >= WINDOW_LINES then
- lineStart = lineStart + 1
- end -- if
- if #lines > 1 then
- lineEnd = lineEnd + 1
- end -- if
- end -- function add_line
- keepscrolling = false
- require "wait"
- function scrollbar(calledBy)
- wait.make (function()
- while keepscrolling == true do
- if calledBy == "up" then
- if (lineStart > 1) then
- lineStart = lineStart - 1
- lineEnd = lineEnd - 1
- WindowRectOp(Win, miniwin.rect_draw_edge, (WINDOW_WIDTH-SCROLL_BAR_WIDTH), theme.TITLE_HEIGHT, 0, theme.TITLE_HEIGHT+SCROLL_BAR_WIDTH,
- miniwin.rect_edge_sunken, miniwin.rect_edge_at_all + miniwin.rect_option_fill_middle) -- up arrow pushed
- points = string.format ("%i,%i,%i,%i,%i,%i", (WINDOW_WIDTH-SCROLL_BAR_WIDTH)+3, theme.TITLE_HEIGHT+9,(WINDOW_WIDTH-SCROLL_BAR_WIDTH)+7, theme.TITLE_HEIGHT+5,(WINDOW_WIDTH-SCROLL_BAR_WIDTH)+11, theme.TITLE_HEIGHT+9)
- WindowPolygon (Win, points,
- theme.DETAIL, miniwin.pen_solid, 1, -- pen (solid, width 1)
- theme.DETAIL, miniwin.brush_solid, -- brush (solid)
- true, -- close
- false) -- alt fill
- else
- keepscrolling = false
- end
- elseif calledBy == "down" then
- if (lineEnd < #lines) then
- lineStart = lineStart + 1
- lineEnd = lineEnd + 1
- WindowRectOp(Win, miniwin.rect_draw_edge, (WINDOW_WIDTH-SCROLL_BAR_WIDTH), WINDOW_HEIGHT-(SCROLL_BAR_WIDTH*2), 0, WINDOW_HEIGHT-SCROLL_BAR_WIDTH-1,
- miniwin.rect_edge_sunken, miniwin.rect_edge_at_all + miniwin.rect_option_fill_middle) -- down arrow pushed
- points = string.format ("%i,%i,%i,%i,%i,%i", (WINDOW_WIDTH-SCROLL_BAR_WIDTH)+3, (WINDOW_HEIGHT-SCROLL_BAR_WIDTH)-11,(WINDOW_WIDTH-SCROLL_BAR_WIDTH)+7, (WINDOW_HEIGHT-SCROLL_BAR_WIDTH)-7, (WINDOW_WIDTH-SCROLL_BAR_WIDTH)+11,(WINDOW_HEIGHT-SCROLL_BAR_WIDTH)-11) -- draw triangle in up button
- WindowPolygon (Win, points,
- theme.DETAIL, miniwin.pen_solid, 1, -- pen (solid, width 1)
- theme.DETAIL, miniwin.brush_solid, -- brush (solid)
- true, -- close
- false) -- alt fill
- else
- keepscrolling = false
- end
- end -- if
- wait.time(0.1)
- refresh()
- end -- while keepscrolling
- end) -- wait.make
- end -- function scrollbar
- function GetLineText (styles)
- local t = {}
- for _, style in ipairs (styles) do
- table.insert (t, style.text)
- end -- for
- return table.concat (t)
- end -- function GetLineText
- function GetAllBufferedMessages()
- local t = {}
- for _,styles in ipairs(rawlines) do
- table.insert (t, GetLineText (styles))
- end -- for
- SetClipboard(table.concat(t,"\r\n"))
- end -- function GetAllBufferedMessages
- function GetBufferedMessage(xpos, ypos)
- windowline = math.floor(((ypos-theme.TITLE_HEIGHT)/line_height)+1)-1
- text = ""
- if (#lines > windowline) then
- local line = windowline+lineStart
- -- go to beginning of message
- while lines[line][2] ~= true and line > 1 do
- line = line - 1
- end -- while
- -- first line
- local styles = copytable.deep(lines[line][1])
- if (line-lineStart+1 > 0) then
- Display_Line (line-lineStart, styles, true)
- end -- if
- text = GetLineText (styles)
- -- remaining lines
- line = line + 1
- while line <= #lines and lines[line][2] ~= true do
- local styles = copytable.deep(lines[line][1])
- if (line-lineStart+1 > 0 and line-lineStart < WINDOW_LINES) then
- Display_Line (line-lineStart, styles, true)
- end
- text = text.. GetLineText (styles)
- line = line + 1
- end -- while
- SetClipboard(text)
- end -- if
- Redraw()
- end -- function GetBufferedMessage
- function MouseOver(flags, hotspot_id)
- keepscrolling = false
- end -- function MouseOver
- function CancelMouseOver(flags, hotspot_id)
- keepscrolling = false
- end -- function CancelMouseOver
- function MouseDown(flags, hotspot_id)
- if (hotspot_id == "resizer") then
- startx, starty = WindowInfo (Win, 17), WindowInfo (Win, 18)
- elseif (hotspot_id == "scroller") then
- clickdelta = WindowHotspotInfo(Win, "scroller", 2)-WindowInfo (Win, 15)
- dragscrolling = true
- elseif (hotspot_id == "textarea" and flags == miniwin.hotspot_got_lh_mouse) then
- GetBufferedMessage(WindowInfo(Win, 14), WindowInfo(Win,15))
- else
- keepscrolling = true
- scrollbar(hotspot_id)
- end -- if
- end -- function MouseDown
- function CancelMouseDown(flags, hotspot_id)
- keepscrolling = false
- refresh()
- end -- function CancelMouseDown
- function MouseUp(flags, hotspot_id)
- if (hotspot_id == "textarea" and flags == miniwin.hotspot_got_rh_mouse) then
- -- build menu for current state
- right_click_menu()
- else
- refresh()
- end -- if
- keepscrolling = false
- end -- function MouseUp
- function chat_echo (name, line, wildcards)
- if wildcards [1] == false then
- echo = not echo -- toggle
- else
- echo = wildcards [1]:lower () == " on"
- end -- if
- if echo then
- ColourNote ("yellow", "", "Echoing chats in main window ENABLED.")
- else
- ColourNote ("yellow", "", "Echoing chats in main window DISABLED.")
- end -- if
- end -- function chat_echo
- function chat_show (name, line, wildcards)
- WindowShow( Win, true )
- ColourNote ("yellow", "", "Chats window now shown. Type 'chats hide' to hide it.")
- end -- function chat_show
- function chat_hide (name, line, wildcards)
- WindowShow( Win, false )
- ColourNote ("yellow", "", "Chats window now hidden. Type 'chats show' to see it again.")
- end -- function chat_hide
- -- right click menu
- function right_click_menu ()
- menustring ="Copy All To Clipboard|Change Font|Turn Echo "
- if echo then
- menustring = menustring .. "Off"
- else
- menustring = menustring .. "On"
- end -- if
- menustring = menustring.."|>Timestamp|No Timestamps|30 Aug 13:29:49|30 Aug 01:20:12PM|13:29:08|1:22:06 PM"
- result = WindowMenu (Win,
- WindowInfo (Win, 14), -- x position
- WindowInfo (Win, 15), -- y position
- menustring) -- content
- if result == "Copy All To Clipboard" then
- GetAllBufferedMessages()
- ColourNote ("yellow", "", "All buffered messages copied to clipboard.")
- elseif result == "Change Font" then
- wanted_font = utils.fontpicker (BODY_FONT_NAME, BODY_FONT_SIZE) --font dialog
- if wanted_font then
- BODY_FONT_NAME = wanted_font.name
- BODY_FONT_SIZE = wanted_font.size
- SetVariable ("bodyfont", BODY_FONT_NAME)
- SetVariable ("font_size", BODY_FONT_SIZE)
- OnPluginInstall()
- end
- elseif result == "Turn Echo Off" then
- echo = false
- ColourNote ("yellow", "", "Echoing chats in main window DISABLED.")
- elseif result == "Turn Echo On" then
- echo = true
- ColourNote ("yellow", "", "Echoing chats in main window ENABLED.")
- elseif result == "No Timestamps" then
- timestamp = false
- ColourNote ("yellow", "", "Timestamps in communication window DISABLED.")
- elseif result == "30 Aug 13:29:49" then
- timestamp = true
- date_format = "[%d %b %H:%M:%S] "
- ColourNote ("yellow", "", "Timestamps in communication window ENABLED using format like '30 Aug 13:29:49'.")
- elseif result == "30 Aug 01:20:12PM" then
- timestamp = true
- date_format = "[%d %b %I:%M:%S%p] "
- ColourNote ("yellow", "", "Timestamps in communication window ENABLED using format like '30 Aug 01:20:12PM'.")
- elseif result == "13:29:08" then
- timestamp = true
- date_format = "[%H:%M:%S] "
- ColourNote ("yellow", "", "Timestamps in communication window ENABLED using format like '13:29:08'.")
- elseif result == "1:22:06 PM" then
- timestamp = true
- date_format = "[%I:%M:%S%p] "
- ColourNote ("yellow", "", "Timestamps in communication window ENABLED using format like '1:22:06 PM'.")
- end -- if
- end -- function right_click_menu
- ]]>
- </script>
- </muclient>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement