WoW:USERAPI RunSlashCmd: Difference between revisions

From AddOn Studio
Jump to navigation Jump to search
No edit summary
m (Move page script moved page USERAPI RunSlashCmd to USERAPI RunSlashCmd without leaving a redirect)
 
(4 intermediate revisions by 4 users not shown)
Line 1: Line 1:
Thanks to cladhaire and Josh_Borke for all the effort in coming up with this code that allows you to pass a /command to wow from a lua script. The following code is cladhaire's final product
{{userfunc}}


The following snippet provides a global function RunSlashCmd that can be used to execute an arbitrary slash command (i.e. "/myaddon hi").
  local _G = _G
  local _G = _G
  local function RunSlashCmd(cmd)
  function RunSlashCmd(cmd)
   local slash, rest = cmd:match("^(%S+)%s*(.-)$")
   local slash, rest = cmd:match("^(%S+)%s*(.-)$")
   for name in pairs(SlashCmdList) do
   for name, func in pairs(SlashCmdList) do
       local i = 1
       local i, slashCmd = 1
      local slashCmd
       repeat
       repeat
         slashCmd = _G["SLASH_"..name..i]
         slashCmd, i = _G["SLASH_"..name..i], i + 1
       
         if slashCmd == slash then
         if slashCmd == slash then
             -- Call the handler
             return true, func(rest)
            SlashCmdList[name](rest)
            return true
         end
         end
        i = i + 1
       until not slashCmd
       until not slashCmd
   end
   end
  end  
  -- Okay, so it's not a slash command. It may also be an emote.
  local i = 1
  while _G["EMOTE" .. i .. "_TOKEN"] do
      local j, cn = 2, _G["EMOTE" .. i .. "_CMD1"]
      while cn do
        if cn == slash then
            return true, DoEmote(_G["EMOTE" .. i .. "_TOKEN"], rest);
        end
        j, cn = j+1, _G["EMOTE" .. i .. "_CMD" .. j]
      end
      i = i + 1
  end
  end


=== Usage ===
=== Usage ===
Line 24: Line 32:
  RunSlashCmd("/addon do this")
  RunSlashCmd("/addon do this")


Try
local t={}; t.GetText = function(self) return self.text end; local function RunSlash(slash) t.text = slash; ChatEdit_ParseText(t) end


== Alternative ==
== Alternative ==
Another method to accomplish the same effect is to insert the command into an editbox and send the command. Note that it's usually better to do this with your own EditBox to avoid taint or conflicts with user input into the default editbox.
Another method to accomplish the same effect is to insert the command into an editbox and send the command. Note that it's usually better to do this with your own EditBox to avoid taint or conflicts with user input into the default editbox.


  -- Create our editbox (may not need a name, untested)
  -- Create our editbox (may not need a name, untested)
Line 36: Line 42:
  ChatEdit_SendText(editbox)
  ChatEdit_SendText(editbox)


[[Category:User Defined Functions]]
However as of 3.3.5 you must set the chatFrame variable on your editbox before the OnLoad function runs. So if you want to use the above code you need to create the frame in XML or create a template and then use that template to create the frame.
 
<EditBox name="MyAddOnEditBoxTemplate" inherits="ChatFrameEditBoxTemplate" virtual="true">
  <Scripts>
    <OnLoad>
        self.chatFrame = self:GetParent();
        ChatEdit_OnLoad(self);
    </OnLoad>
  </Scripts>
</EditBox>
 
And then use:
-- Create our editbox
local editbox = CreateFrame("EditBox", "MyAddOnEditBox", UIParent, "MyAddOnEditBoxTemplate")
editbox:SetText("/command here")
ChatEdit_SendText(editbox)
[[Category:User defined functions]]

Latest revision as of 04:49, 15 August 2023

This page documents a <i>user-defined function</i> that you can copy and paste into your addon. Replace PREFIX with your addon or lib prefix to avoid conflicts between different versions of these functions.

User defined functions

The following snippet provides a global function RunSlashCmd that can be used to execute an arbitrary slash command (i.e. "/myaddon hi").

local _G = _G
function RunSlashCmd(cmd)
  local slash, rest = cmd:match("^(%S+)%s*(.-)$")
  for name, func in pairs(SlashCmdList) do
     local i, slashCmd = 1
     repeat
        slashCmd, i = _G["SLASH_"..name..i], i + 1
        if slashCmd == slash then
           return true, func(rest)
        end
     until not slashCmd
  end
  -- Okay, so it's not a slash command. It may also be an emote.
  local i = 1
  while _G["EMOTE" .. i .. "_TOKEN"] do
     local j, cn = 2, _G["EMOTE" .. i .. "_CMD1"]
     while cn do
        if cn == slash then
           return true, DoEmote(_G["EMOTE" .. i .. "_TOKEN"], rest);
        end
        j, cn = j+1, _G["EMOTE" .. i .. "_CMD" .. j]
     end
     i = i + 1
  end
end

Usage[edit]

RunSlashCmd("/help")
RunSlashCmd("/addon do this")


Alternative[edit]

Another method to accomplish the same effect is to insert the command into an editbox and send the command. Note that it's usually better to do this with your own EditBox to avoid taint or conflicts with user input into the default editbox.

-- Create our editbox (may not need a name, untested)
local editbox = CreateFrame("EditBox", "myEditBox", UIParent, "ChatFrameEditBoxTemplate")

editbox:SetText("/command here") 
ChatEdit_SendText(editbox)

However as of 3.3.5 you must set the chatFrame variable on your editbox before the OnLoad function runs. So if you want to use the above code you need to create the frame in XML or create a template and then use that template to create the frame.

<EditBox name="MyAddOnEditBoxTemplate" inherits="ChatFrameEditBoxTemplate" virtual="true">
  <Scripts>
    <OnLoad>
       self.chatFrame = self:GetParent();
       ChatEdit_OnLoad(self);
    </OnLoad>
  </Scripts>
</EditBox>

And then use:

-- Create our editbox
local editbox = CreateFrame("EditBox", "MyAddOnEditBox", UIParent, "MyAddOnEditBoxTemplate")

editbox:SetText("/command here") 
ChatEdit_SendText(editbox)