mudgangster

Tiny, scriptable MUD client
Log | Files | Refs | README

alias.lua (1945B)


      1 local Aliases = { }
      2 
      3 local function doAlias( line )
      4 	local command, args = line:match( "^(%S+)%s*(.*)$" )
      5 	local alias = Aliases[ command ]
      6 
      7 	if alias and alias.enabled then
      8 		local badSyntax = true
      9 
     10 		for i = 1, #alias.callbacks do
     11 			local callback = alias.callbacks[ i ]
     12 			local ok, err, subs = xpcall( string.gsub, debug.traceback, args, callback.pattern, callback.callback )
     13 
     14 			if not ok then
     15 				mud.print( "\n#s> alias callback failed: %s", err )
     16 
     17 				return true
     18 			end
     19 
     20 			if subs ~= 0 then
     21 				badSyntax = false
     22 
     23 				break
     24 			end
     25 		end
     26 
     27 		if badSyntax then
     28 			mud.print( "\nsyntax: %s %s", command, alias.syntax )
     29 		end
     30 
     31 		return true
     32 	end
     33 
     34 	return false
     35 end
     36 
     37 local function simpleAlias( callback, disabled )
     38 	return {
     39 		callbacks = {
     40 			{
     41 				pattern = "^(.*)$",
     42 				callback = callback,
     43 			},
     44 		},
     45 
     46 		enabled = not disabled,
     47 
     48 		enable = function( self )
     49 			self.enabled = true
     50 		end,
     51 		disable = function( self )
     52 			self.enabled = false
     53 		end,
     54 	}
     55 end
     56 
     57 local function patternAlias( callbacks, syntax, disabled )
     58 	local alias = {
     59 		callbacks = { },
     60 		syntax = syntax,
     61 
     62 		enabled = not disabled,
     63 
     64 		enable = function( self )
     65 			self.enabled = true
     66 		end,
     67 		disable = function( self )
     68 			self.enabled = false
     69 		end,
     70 	}
     71 
     72 	for pattern, callback in pairs( callbacks ) do
     73 		table.insert( alias.callbacks, {
     74 			pattern = pattern,
     75 			callback = callback,
     76 		} )
     77 	end
     78 
     79 	return alias
     80 end
     81 
     82 function mud.alias( command, handler, ... )
     83 	enforce( command, "command", "string" )
     84 	enforce( handler, "handler", "function", "string", "table" )
     85 
     86 	assert( not Aliases[ command ], "alias `%s' already registered" % command )
     87 
     88 	if type( handler ) == "string" then
     89 		local command = handler
     90 
     91 		handler = function( args )
     92 			mud.input( command % args )
     93 		end
     94 	end
     95 
     96 	local alias = type( handler ) == "function"
     97 		and simpleAlias( handler, ... )
     98 		or patternAlias( handler, ... )
     99 
    100 	Aliases[ command ] = alias
    101 
    102 	return alias
    103 end
    104 
    105 return {
    106 	doAlias = doAlias,
    107 }