| 
									
										
										
										
											2007-11-02 15:36:34 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CONSOLE = "Console/dsp" -- Console interface for demo | 
					
						
							| 
									
										
										
										
											2008-06-12 17:27:55 +00:00
										 |  |  | --CONSOLE = "DAHDI/1" | 
					
						
							| 
									
										
										
										
											2007-11-02 15:36:34 +00:00
										 |  |  | --CONSOLE = "Phone/phone0" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | IAXINFO = "guest"       -- IAXtel username/password | 
					
						
							|  |  |  | --IAXINFO = "myuser:mypass" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 17:27:55 +00:00
										 |  |  | TRUNK = "DAHDI/G2" | 
					
						
							| 
									
										
										
										
											2007-11-02 15:36:34 +00:00
										 |  |  | TRUNKMSD = 1 | 
					
						
							|  |  |  | -- TRUNK = "IAX2/user:pass@provider" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | -- | 
					
						
							|  |  |  | -- Extensions are expected to be defined in a global table named 'extensions'. | 
					
						
							|  |  |  | -- The 'extensions' table should have a group of tables in it, each | 
					
						
							|  |  |  | -- representing a context.  Extensions are defined in each context.  See below | 
					
						
							|  |  |  | -- for examples. | 
					
						
							|  |  |  | -- | 
					
						
							|  |  |  | -- Extension names may be numbers, letters, or combinations thereof. If | 
					
						
							|  |  |  | -- an extension name is prefixed by a '_' character, it is interpreted as | 
					
						
							|  |  |  | -- a pattern rather than a literal.  In patterns, some characters have | 
					
						
							|  |  |  | -- special meanings: | 
					
						
							| 
									
										
										
										
											2009-05-28 14:39:21 +00:00
										 |  |  | -- | 
					
						
							| 
									
										
										
										
											2007-11-02 15:36:34 +00:00
										 |  |  | --   X - any digit from 0-9 | 
					
						
							|  |  |  | --   Z - any digit from 1-9 | 
					
						
							|  |  |  | --   N - any digit from 2-9 | 
					
						
							|  |  |  | --   [1235-9] - any digit in the brackets (in this example, 1,2,3,5,6,7,8,9) | 
					
						
							| 
									
										
										
										
											2009-05-28 14:39:21 +00:00
										 |  |  | --   . - wildcard, matches anything remaining (e.g. _9011. matches | 
					
						
							| 
									
										
										
										
											2007-11-02 15:36:34 +00:00
										 |  |  | --       anything starting with 9011 excluding 9011 itself) | 
					
						
							|  |  |  | --   ! - wildcard, causes the matching process to complete as soon as | 
					
						
							|  |  |  | --       it can unambiguously determine that no other matches are possible | 
					
						
							| 
									
										
										
										
											2009-05-28 14:39:21 +00:00
										 |  |  | -- | 
					
						
							| 
									
										
										
										
											2007-11-02 15:36:34 +00:00
										 |  |  | -- For example the extension _NXXXXXX would match normal 7 digit | 
					
						
							|  |  |  | -- dialings, while _1NXXNXXXXXX would represent an area code plus phone | 
					
						
							|  |  |  | -- number preceded by a one. | 
					
						
							| 
									
										
										
										
											2009-05-28 14:39:21 +00:00
										 |  |  | -- | 
					
						
							| 
									
										
										
										
											2007-11-02 15:36:34 +00:00
										 |  |  | -- If your extension has special characters in it such as '.' and '!' you must | 
					
						
							|  |  |  | -- explicitly make it a string in the tabale definition: | 
					
						
							|  |  |  | -- | 
					
						
							|  |  |  | --   ["_special."] = function; | 
					
						
							|  |  |  | --   ["_special!"] = function; | 
					
						
							|  |  |  | -- | 
					
						
							|  |  |  | -- There are no priorities.  All extensions to asterisk appear to have a single | 
					
						
							|  |  |  | -- priority as if they consist of a single priority. | 
					
						
							| 
									
										
										
										
											2009-05-28 14:39:21 +00:00
										 |  |  | -- | 
					
						
							| 
									
										
										
										
											2007-11-02 15:36:34 +00:00
										 |  |  | -- Each context is defined as a table in the extensions table.  The | 
					
						
							|  |  |  | -- context names should be strings. | 
					
						
							|  |  |  | -- | 
					
						
							|  |  |  | -- One context may be included in another context using the 'includes' | 
					
						
							|  |  |  | -- extension.  This extension should be set to a table containing a list | 
					
						
							|  |  |  | -- of context names.  Do not put references to tables in the includes | 
					
						
							|  |  |  | -- table. | 
					
						
							| 
									
										
										
										
											2009-05-28 14:39:21 +00:00
										 |  |  | -- | 
					
						
							| 
									
										
										
										
											2007-11-02 15:36:34 +00:00
										 |  |  | --   include = {"a", "b", "c"}; | 
					
						
							|  |  |  | -- | 
					
						
							|  |  |  | -- Channel variables can be accessed thorugh the global 'channel' table. | 
					
						
							|  |  |  | -- | 
					
						
							|  |  |  | --   v = channel.var_name | 
					
						
							|  |  |  | --   v = channel["var_name"] | 
					
						
							|  |  |  | --   v.value | 
					
						
							|  |  |  | --   v:get() | 
					
						
							|  |  |  | -- | 
					
						
							|  |  |  | --   channel.var_name = "value" | 
					
						
							|  |  |  | --   channel["var_name"] = "value" | 
					
						
							|  |  |  | --   v:set("value") | 
					
						
							|  |  |  | -- | 
					
						
							|  |  |  | --   channel.func_name(1,2,3):set("value") | 
					
						
							|  |  |  | --   value = channel.func_name(1,2,3):get() | 
					
						
							|  |  |  | -- | 
					
						
							| 
									
										
										
										
											2007-12-07 21:28:49 +00:00
										 |  |  | --   channel["func_name(1,2,3)"]:set("value") | 
					
						
							|  |  |  | --   channel["func_name(1,2,3)"] = "value" | 
					
						
							|  |  |  | --   value = channel["func_name(1,2,3)"]:get() | 
					
						
							| 
									
										
										
										
											2007-11-02 15:36:34 +00:00
										 |  |  | -- | 
					
						
							|  |  |  | -- Note the use of the ':' operator to access the get() and set() | 
					
						
							|  |  |  | -- methods. | 
					
						
							|  |  |  | -- | 
					
						
							|  |  |  | -- Also notice the absence of the following constructs from the examples above: | 
					
						
							|  |  |  | --   channel.func_name(1,2,3) = "value"  -- this will NOT work | 
					
						
							|  |  |  | --   value = channel.func_name(1,2,3)    -- this will NOT work as expected | 
					
						
							| 
									
										
										
										
											2009-05-28 14:39:21 +00:00
										 |  |  | -- | 
					
						
							| 
									
										
										
										
											2007-11-02 15:36:34 +00:00
										 |  |  | -- | 
					
						
							|  |  |  | -- Dialplan applications can be accessed through the global 'app' table. | 
					
						
							|  |  |  | -- | 
					
						
							| 
									
										
										
										
											2008-06-12 17:27:55 +00:00
										 |  |  | --    app.Dial("DAHDI/1") | 
					
						
							|  |  |  | --    app.dial("DAHDI/1") | 
					
						
							| 
									
										
										
										
											2014-06-18 17:20:13 +00:00
										 |  |  | --    app["dial"]("DAHDI/1") | 
					
						
							| 
									
										
										
										
											2007-11-02 15:36:34 +00:00
										 |  |  | -- | 
					
						
							|  |  |  | -- More examples can be found below. | 
					
						
							|  |  |  | -- | 
					
						
							| 
									
										
										
										
											2011-05-06 19:19:56 +00:00
										 |  |  | -- An autoservice is automatically run while lua code is executing.  The | 
					
						
							|  |  |  | -- autoservice can be stopped and restarted using the autoservice_stop() and | 
					
						
							|  |  |  | -- autoservice_start() functions.  The autservice should be running before | 
					
						
							|  |  |  | -- starting long running operations. The autoservice will automatically be | 
					
						
							|  |  |  | -- stopped before executing applications and dialplan functions and will be | 
					
						
							|  |  |  | -- restarted afterwards.  The autoservice_status() function can be used to | 
					
						
							|  |  |  | -- check the current status of the autoservice and will return true if an | 
					
						
							|  |  |  | -- autoservice is currently running. | 
					
						
							| 
									
										
										
										
											2007-11-02 15:36:34 +00:00
										 |  |  | -- | 
					
						
							| 
									
										
										
										
											2014-06-18 17:20:13 +00:00
										 |  |  | -- Note about naming conflicts: | 
					
						
							|  |  |  | -- Lua allows you to refer to table entries using the '.' notation, | 
					
						
							|  |  |  | -- I.E. app.goto(something), only if the entry doesn't conflict with an Lua | 
					
						
							|  |  |  | -- reserved word.  In the 'goto' example, with Lua 5.1 or earlier, 'goto' is | 
					
						
							|  |  |  | -- not a reserved word so you'd be calling the Asterisk dialplan application | 
					
						
							|  |  |  | -- 'goto'.  Lua 5.2 however, introduced the 'goto' control statement which | 
					
						
							|  |  |  | -- makes 'goto' a reserved word.  This casues the interpreter to fail parsing | 
					
						
							|  |  |  | -- the file and pbx_lua.so will fail to load.  The same applies to any use of | 
					
						
							|  |  |  | -- Lua tables including extensions, channels and any tables you create. | 
					
						
							|  |  |  | -- | 
					
						
							|  |  |  | -- There are two ways around this:  Since Lua is case-sensitive, you can use | 
					
						
							|  |  |  | -- capitalized names, I.E. app.Goto(something) to refer to the Asterisk apps, | 
					
						
							|  |  |  | -- functions, etc. Or you can use the full syntax, I.E. app["goto"](something). | 
					
						
							|  |  |  | -- Both syntaxes are backwards compatible with earlier Lua versions.  To make | 
					
						
							|  |  |  | -- your Lua dialplans easier to maintain and to reduce the chance of future | 
					
						
							|  |  |  | -- conflicts you may want to use the app["goto"](something) syntax for all | 
					
						
							|  |  |  | -- table accesses. | 
					
						
							|  |  |  | -- | 
					
						
							| 
									
										
										
										
											2007-11-02 15:36:34 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | function outgoing_local(c, e) | 
					
						
							| 
									
										
										
										
											2009-05-28 14:39:21 +00:00
										 |  |  | 	app.dial("DAHDI/1/" .. e, "", "") | 
					
						
							| 
									
										
										
										
											2007-11-02 15:36:34 +00:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function demo_instruct() | 
					
						
							| 
									
										
										
										
											2009-05-28 14:39:21 +00:00
										 |  |  | 	app.background("demo-instruct") | 
					
						
							|  |  |  | 	app.waitexten() | 
					
						
							| 
									
										
										
										
											2007-11-02 15:36:34 +00:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function demo_congrats() | 
					
						
							| 
									
										
										
										
											2009-05-28 14:39:21 +00:00
										 |  |  | 	app.background("demo-congrats") | 
					
						
							|  |  |  | 	demo_instruct() | 
					
						
							| 
									
										
										
										
											2007-11-02 15:36:34 +00:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | -- Answer the chanel and play the demo sound files | 
					
						
							|  |  |  | function demo_start(context, exten) | 
					
						
							| 
									
										
										
										
											2009-05-28 14:39:21 +00:00
										 |  |  | 	app.wait(1) | 
					
						
							|  |  |  | 	app.answer() | 
					
						
							| 
									
										
										
										
											2007-11-02 15:36:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-28 14:39:21 +00:00
										 |  |  | 	channel.TIMEOUT("digit"):set(5) | 
					
						
							|  |  |  | 	channel.TIMEOUT("response"):set(10) | 
					
						
							|  |  |  | 	-- app.set("TIMEOUT(digit)=5") | 
					
						
							|  |  |  | 	-- app.set("TIMEOUT(response)=10") | 
					
						
							| 
									
										
										
										
											2007-11-02 15:36:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-28 14:39:21 +00:00
										 |  |  | 	demo_congrats(context, exten) | 
					
						
							| 
									
										
										
										
											2007-11-02 15:36:34 +00:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function demo_hangup() | 
					
						
							| 
									
										
										
										
											2009-05-28 14:39:21 +00:00
										 |  |  | 	app.playback("demo-thanks") | 
					
						
							|  |  |  | 	app.hangup() | 
					
						
							| 
									
										
										
										
											2007-11-02 15:36:34 +00:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extensions = { | 
					
						
							| 
									
										
										
										
											2009-05-28 14:39:21 +00:00
										 |  |  | 	demo = { | 
					
						
							|  |  |  | 		s = demo_start; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		["2"] = function() | 
					
						
							|  |  |  | 			app.background("demo-moreinfo") | 
					
						
							|  |  |  | 			demo_instruct() | 
					
						
							|  |  |  | 		end; | 
					
						
							|  |  |  | 		["3"] = function () | 
					
						
							|  |  |  | 			channel.LANGUAGE():set("fr") -- set the language to french | 
					
						
							|  |  |  | 			demo_congrats() | 
					
						
							|  |  |  | 		end; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		["1000"] = function() | 
					
						
							| 
									
										
										
										
											2014-06-18 17:20:13 +00:00
										 |  |  | --	See the naming conflict note above. | 
					
						
							|  |  |  | 			app['goto']("default", "s", 1) | 
					
						
							| 
									
										
										
										
											2009-05-28 14:39:21 +00:00
										 |  |  | 		end; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		["1234"] = function() | 
					
						
							|  |  |  | 			app.playback("transfer", "skip") | 
					
						
							|  |  |  | 			-- do a dial here | 
					
						
							|  |  |  | 		end; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		["1235"] = function() | 
					
						
							|  |  |  | 			app.voicemail("1234", "u") | 
					
						
							|  |  |  | 		end; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		["1236"] = function() | 
					
						
							|  |  |  | 			app.dial("Console/dsp") | 
					
						
							|  |  |  | 			app.voicemail(1234, "b") | 
					
						
							|  |  |  | 		end; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		["#"] = demo_hangup; | 
					
						
							|  |  |  | 		t = demo_hangup; | 
					
						
							|  |  |  |                 i = function() | 
					
						
							|  |  |  |                         app.playback("invalid") | 
					
						
							|  |  |  |                         demo_instruct() | 
					
						
							|  |  |  |                 end; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		["500"] = function() | 
					
						
							|  |  |  | 			app.playback("demo-abouttotry") | 
					
						
							|  |  |  | 			app.dial("IAX2/guest@misery.digium.com/s@default") | 
					
						
							|  |  |  | 			app.playback("demo-nogo") | 
					
						
							|  |  |  | 			demo_instruct() | 
					
						
							|  |  |  | 		end; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		["600"] = function() | 
					
						
							|  |  |  | 			app.playback("demo-echotest") | 
					
						
							|  |  |  | 			app.echo() | 
					
						
							|  |  |  | 			app.playback("demo-echodone") | 
					
						
							|  |  |  | 			demo_instruct() | 
					
						
							|  |  |  | 		end; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		["8500"] = function() | 
					
						
							|  |  |  | 			app.voicemailmain() | 
					
						
							|  |  |  | 			demo_instruct() | 
					
						
							|  |  |  | 		end; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	default = { | 
					
						
							|  |  |  | 		-- by default, do the demo | 
					
						
							|  |  |  | 		include = {"demo"}; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-12 17:34:39 +00:00
										 |  |  | 	public = { | 
					
						
							|  |  |  | 		-- ATTENTION: If your Asterisk is connected to the internet and you do | 
					
						
							|  |  |  | 		-- not have allowguest=no in sip.conf, everybody out there may use your | 
					
						
							|  |  |  | 		-- public context without authentication.  In that case you want to | 
					
						
							|  |  |  | 		-- double check which services you offer to the world. | 
					
						
							|  |  |  | 		-- | 
					
						
							|  |  |  | 		include = {"demo"}; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-28 14:39:21 +00:00
										 |  |  | 	["local"] = { | 
					
						
							|  |  |  | 		["_NXXXXXX"] = outgoing_local; | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2007-11-02 15:36:34 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-04 17:44:44 +00:00
										 |  |  | hints = { | 
					
						
							|  |  |  | 	demo = { | 
					
						
							|  |  |  | 		[1000] = "SIP/1000"; | 
					
						
							|  |  |  | 		[1001] = "SIP/1001"; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	default = { | 
					
						
							|  |  |  | 		["1234"] = "SIP/1234"; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | } |