Notice: Any messages purporting to come from this site telling you that your password has expired, or that you need to verify your details, confirm your email, resolve issues, making threats, or asking for money, are
spam. We do not email users with any such messages. If you have lost your password you can obtain a new one by using the
password reset link.
Due to spam on this forum, all posts now need moderator approval.
Entire forum
➜ MUSHclient
➜ Lua
➜ Lua Tables
It is now over 60 days since the last post. This thread is closed.
Refresh page
Posted by
| Wyd
(14 posts) Bio
|
Date
| Wed 27 Sep 2006 07:04 AM (UTC) |
Message
| Hi all.
I am trying to write a script with uses a queue system to control the comands that are sent to the mud.
I want to be able to enter a alias, whith a parameter, such that the alias puts the required commands into the queue, another alias then gets the the first command from the queue, and sends it to the mud.
Im guessing to do this, I need to be use Lua tables (as I am programming it in Lua). From reading around the site and other Lua sites, i have worked out how to get the commands to come out in the right order (in theory, cant get it to show though), and such, but I am having problems with two things:
1, putting a string into the table which contains variables
-- Such as "Tell @person go north"
2, getting the script to output the string it contains
-- Sending the above to the mud
Hope this makes sense
Wyd
| Top |
|
Posted by
| Ked
Russia (524 posts) Bio
|
Date
| Reply #1 on Wed 27 Sep 2006 08:24 AM (UTC) Amended on Wed 27 Sep 2006 08:30 AM (UTC) by Ked
|
Message
| Lua can't interpret Mushclient variables, like Mushclient itself can. But what you want can still be accomplished, although with some hoops to jump.
You can make your queue hold tables, instead of strings. Each table should have a boolean field, called "interp" for example. So that a plain string that should be sent directly to the MUD without any processing has field "interp" set false, while a table with a string that needs to have variables expanded or contains a script has "interp" set true.
Further, when retrieving a table from a queue, you check the "interp" field and if it is true then you add a temporary alias, set its Send property to the table's string, set it to send to scripting, set expand variables, and Execute that alias. It'll probably make more sense in code (I've also added an option to send to scripting):
queue = {}
table.insert(queue, "say Hello!")
table.insert(queue, {interp=true, text="tell @person Hello!"})
table.insert(queue, {interp=true, script=true, text="Send('tell @person Hello!')"})
function remove_alias(name)
EnableAlias(name, false)
DoAfterSpecial (1, "DeleteAlias ('" .. name .. "')", 12) -- delete it
end
function sendQueue()
local tosend = table.remove(queue)
-- if its a plain string then we don't need to do anything special
--
if type(tosend) == "string" then
Send(tosend)
return
-- if its a table then we need to execute it through an alias
--
elseif type(tosend) == "table" then
-- set the default flags for the alias
local flags = alias_flag.Enabled + alias_flag.Temporary
-- if the "interp" option is set then alias needs to expand variables
flags = tosend.interp and (flags + alias_flag.ExpandVariables) or flags
-- get a unique number to use for alias' match and name
local alias_id = GetUniqueID()
-- create the alias
AddAlias("queue_alias_" .. alias_id, alias_id, tosend.text, flags, "remove_alias")
-- if the "script" option is set then the alias must also send to scripting
--
if tosend.script then
SetAliasOption("queue_alias_" .. alias_id, "send_to", "12")
end
-- execute the alias
Execute(alias_id)
end
end
-- test it
--
sendQueue()
sendQueue()
sendQueue()
| Top |
|
Posted by
| Nick Gammon
Australia (23,133 posts) Bio
Forum Administrator |
Date
| Reply #2 on Wed 27 Sep 2006 08:45 AM (UTC) Amended on Wed 27 Sep 2006 08:50 AM (UTC) by Nick Gammon
|
Message
| I was going to do it a bit differently, both methods no doubt have their merits. :)
First, we need to replace variables in the command you type, I did it with a string.gsub, which calls a function to do the replacement:
<aliases>
<alias
match="queue *"
enabled="y"
send_to="12"
sequence="100"
>
<send>queue = queue or {} -- make table if it doesn't exist
do
local command = [[%1]] -- get wildcard 1
local errors = {} -- no errors yet
-- function to do the replacements for string.gsub
local function replace_variables (s)
s = string.sub (s, 2) -- remove the @
replacement = GetVariable (s) -- look up variable
if not replacement then -- not there, add to errors list
table.insert (errors, s)
return
end -- not there
return replacement -- return variable
end -- replace_variables
-- replace all variables starting with @
command = string.gsub (command, "@%a[%w_]*", replace_variables)
-- report any errors
if table.getn (errors) > 0 then
for k, v in ipairs (errors) do
ColourNote ("white", "red", "Variable '" .. v .. "' does not exist")
end -- for
return
end -- error in replacing
-- add to queue
table.insert (queue, command)
end -- do
</send>
</alias>
</aliases>
This will gradually add things you queue into "queue" table, which it creates if it doesn't exist yet.
Now we need a timer to pull them out of the queue:
<timers>
<timer enabled="y" second="2.00" send_to="12"
>
<send>if type (queue) ~= "table" then
return
end -- if no queue
if table.getn (queue) == 0 then
return
end -- if nothing in queue
-- get head of queue, send to MUD
Send (table.remove (queue, 1))</send>
</timer>
</timers>
This timer I set to fire every 2 seconds, just adjust that to your requirements.
This pulls the head of the queue out and sends it to the MUD.
|
- Nick Gammon
www.gammon.com.au, www.mushclient.com | Top |
|
Posted by
| Wyd
(14 posts) Bio
|
Date
| Reply #3 on Thu 28 Sep 2006 10:12 PM (UTC) |
Message
| Thanks.
Thats really helpful, and exaclty what I needed. One question though, as both scripts have a different way of handling things, are they better in different situations? Not really needed, but it'll be interesting to know.
| Top |
|
Posted by
| Nick Gammon
Australia (23,133 posts) Bio
Forum Administrator |
Date
| Reply #4 on Fri 29 Sep 2006 08:29 PM (UTC) |
Message
| Well, Ked's version creates aliases on-the-fly to let MUSHclient's internal routines expand variables, and then sets a timer to delete them a moment later.
He also supports scripting in the queue.
Mine is a bit simpler, but doesn't have the support for scripting. I suppose it depends which you find easier to use. |
- Nick Gammon
www.gammon.com.au, www.mushclient.com | Top |
|
The dates and times for posts above are shown in Universal Co-ordinated Time (UTC).
To show them in your local time you can join the forum, and then set the 'time correction' field in your profile to the number of hours difference between your location and UTC time.
18,146 views.
It is now over 60 days since the last post. This thread is closed.
Refresh page
top