I been looking at my dialing plan and everything works great i can IN & OUT call with out a problem but there is one thing i would love to be able to do.
i want to be able to call this for ex : '742' => '6506441934@podlinez.net', # Prairie Home Companion's
but for some reason any time i dial SPEEDDIAL 742 all i get is fast busy seems like it never dials out
I copied my dial plan i have been using for a bit now but maybe some one here knows the reason why i can not call that or any podlinez
I'm using GOOGLE VOICE + IPKALL + SIPSORCERY + PAP2 everything works but the dialing of PODLINEZ
ANYONE WANNA HELP
Code: Select all
class Hash; alias :+ :merge; end; Home,Mobile,Work,Gizmo = 1,2,3,7
# --------BEGIN MANDATORY ENTRIES SECTION-----------------------------#
Area = '646' # my area code, this will be added to 7-digit dialouts
Tz = -5 # my time zone (GMT format, e.g. Eastern = -5, Central = -6)
# *************** Google Voice Configuration Section *********************
Credentials = { :usr => 'xxxxxxxxxx@gmail.com', :pwd => 'xxxxxxx' } # Your GV login and password
# Your account description is next. It should contain at least one callback
# number.
GVaccount = [
Credentials + { :cb => '(360) xxx-xxxx' }, # IPKall callback number
]
# *************** SIP Provider Configuration Section *********************
VSPtab = {
'0' => '00 @ F9', # Future-nine default route
'2' => '02 @ F9', # Future-nine grey route
'3' => '03 @ F9', # Future-nine white route
'4' => '04 @ F9', # Future-nine premium route
'5' => '@ Sipgate', # sipgate
'7' => '@ Gizmo', # gizmo
}
# ------ END MANDATORY ENTRIES SECTION-----------------------------#
# ------ BEGIN OPTIONAL PARAMETERS SECTION ------------------------#
# Speed dial entries. Format: "short code" => "destination (POTS or SIP)"
Speeddial = {
'303' => '303@sip.blueface.ie', # Blueface speaking clock (Ireland time)
'266' => '4153767253@podlinez.net', # CNN Headlines (266 = "CNN")
'677' => '8186882773@podlinez.net', # NPR's most e-mailed stories (677 ="NPR")
'742' => '6506441934@podlinez.net', # Prairie Home Companion's, or PHC's
# News from Lake Wobegon (742 = "PHC")
'932' => '7755333366', # Columbus OH-based national weather (932 = "WEA[ther]")
}
# CNAM table: number in ENUM format => caller's name
CNAM = {
}
# Uncomment next line and insert your White Pages API key, if you have it
WP_key = 'XXXXXXXXX' # White Pages API key
# ------ END OPTIONAL PARAMETERS SECTION ==------------------------#
# Serviced domains, must be in lowercase!
Domains = ['sipsorcery.com','sip.sipsorcery.com','sip1.sipsorcery.com','sip2.sipsorcery.com','69.59.142.213']
Host = 'sipsorcery.com' # incoming calls will come with this host
# Enum list from sipbroker
EnumDB = [
'e164.org',
'e164.info',
'e164.arpa',
'e164.televolution.net',
'enum.org',
]
# Uncomment line below to enable misdialing safeguards
EnableSafeguards = 1
Allowed_Country = %w{
1 33 36 39 41 420 44 49 7 86 883 886 90 972
}
# Excluded Prefixes. Provides a safeguard against accidentally calling premium
# numbers. Accepts both strings and patterns, spaces ignored
ExcludedPrefixes = [
' 1 (900 | 809)', # USA Premium
' 1 \d\d\d 555 1212', # USA Directory assistance
'44 (9 | 55 | 70 | 84 | 87)', # UK Premium
'49 (1 [^567] | 900)', # Germany Premium
'39 (1 | 84 | 89)', # Italy Premium
'420 90', # Czech Premium
]
# ******************** s e l e c t V S P ***************
def selectVSP # VoIP provider selection
case @num
when /^1([2-9]\d\d)/ # North America
case $1 # check area code
when "777"
route(6,"Gizmo5 to Gizmo5 call")
else
gvcall GVaccount
sys.Log("GoogleVoiceCall failed, routing thru Future-Nine")
route(4,"Destination - North America non-GV")
end
when /^972(5|6)/ # Israel mobile
route(3,"Destination - Israel mobile")
else
rejectCall(603,"Number's too short, check & dial again") if @num.length < 9
route(0,"Default route applied")
end
end
# **************************** C H E C K N U M **************************
def checkNum
@num.match(/^\D/) && return # skip if number doesn't begin with a digit
# Reject calls to not blessed countries and premium numbers
# (unless VSP was forced using #n dial prefix)
rejectCall(503,"Calls to this country not allowed") unless @num.match "^(#{Allowed_Country.join('|')})"
rejectCall(503,"Calls to #$&* not allowed") if @num.match '^(' + ExcludedPrefixes.map { |x| "(:?#{x.gsub(/\s*/,'')})" }.join('|') + ')'
end
# ************************** C A L L S W I T C H **********************
def callswitch(num,*args)
route # Initialize vars
num.gsub!(/%(..)/) {$1.to_i(16).chr} # Convert %hh into ASCII
@num = num unless @num = Speeddial[num] # If there is speed dial entry for it...
@l = "URI dialing: #{@num}" # Assume URI dialing
unless @num =~ /@/ # If we already have URI, skip all number processing
if @num =~ /^#(.)(.*)/ # If number starts with '#'
@p = $1; @num = $2 # next char is VSP code
end
@num.gsub!(/[^0-9*+]/,'') # Delete all fancy chars (only digits, '+' and '*' allowed)
# sub! below removes prefixes:
# '+' - international format
# 00 - European style international prefix (00)
# 011 - US style international prefix (011)
unless @num.sub!(/^(\+|00|011)/,'') # If no international prefix, process special cases below
case @num
when /^[2-9]\d{6,6}$/ # Local call, 7-digit number
@num = '1' + Area + @num # prefix it with country and area code
when /^[01]?([2-9]\d{9,9})/ # US number with or without "1" country code
@num = '1' + $1 # add country code and truncate number to 10-digit
when /^\*/ # Voxalot voicemail, echotest & other special numbers
else
rejectCall(603,'Wrong number, check & dial again')
end
end
sys.Log("Number in ENUM format: #{@num}")
@l = "Forced routing to provider #{@p}, template '#{VSPtab[@p]}'" # Assume user explicitly selected VSP
if @p.empty? # Automatic VSP selection?
checkNum if defined? EnableSafeguards
route # re-initialize variables
selectVSP # Pick appropriate provider for the call
EnumDB.each do |db| # Look in all enum databases
if enumuri = sys.ENUMLookup("#{@num}.#{db}")
sys.Log("ENUM entry found: '#{enumuri}' in #{db} database")
sys.Dial(enumuri) # If yes, call that URI
status()
sys.Log("Call to #{enumuri} failed (#{@reason})")
end
end # ENUM not found or failed, call via regular VSP
end # @p.empty
end # URI
dial(*args) # dial selected number or URI
end
# ******************************* D I A L ********************************
def dial(*args)
sys.Log(@l) unless @l.empty? # for the record :)
if tpl=VSPtab[@p.to_s] # if provider is in our table
tpl.gsub!(/\s*/,'') # Remove spaces
@num = tpl.gsub(/@/,@num+'@') # Insert number before '@'
end
sys.Dial(@num,*args) # Dial
status() # We shouldn't be here! Get error code...
sys.Log("Call failed: code #{@code}, #{@reason}")
end
# **************************** G V C A L L *****************************
def gvcall accounts, n = [2,accounts.length].min, r = 0
n.times do |acnt|
a = {:num => @num, :tmo => 15, :match => '.*'} # init with num & default values
a.update(accounts[(acnt+r) % accounts.length]) # add other params
a[:cb].gsub!(/\D/,'') # Delete all but digits
a[:type] ||= (a[:cb] =~ /^1?777/) ? Gizmo : Home # if no type, define it depending on area code
sys.GoogleVoiceCall *a.values_at(:usr, :pwd, :cb, :num, :match, :type, :tmo)
end
end
# ****************************** R O U T E *******************************
def route(p='', l='')
@p = p; @l = l
end
# ***************************** S T A T U S ******************************
def status
begin
@code, @reason = 487, 'Cancelled by Sipsorcery' unless @code
sys.LastDialled.each do |ptr|
if ptr
ptr = ptr.TransactionFinalResponse
@code = ptr.StatusCode; @reason = ptr.ReasonPhrase; break if @code == 200
end
end
rescue
end
end
# ************************ r e j e c t C a l l ***************************
def rejectCall code, reason
@code = code; @reason = reason
sys.Respond code, reason
end
# ************************* f o r m a t N u m ****************************
def formatNum(num)
case num
when /^([17])(\d{3})(\d{3})(\d{4})$/, # USA, Russia
/^(380|375)(\d{2})(\d{3})(\d{4})$/, # Ukraine, Belarus
/^(41)(\d{2})(\d{3})(\d{4})$/, # Swiss
/^(972|998)(\d{2})(\d{3})(\d{4})$/, # Israel, Uzbekistan
/^(36)(\d)(\d{3})(\d{4})$/ # Hungary
"+#$1 (#$2) #$3-#$4"
when /^(33|44)(\d)(\d{2})(\d{2})(\d{2})(\d{2})$/ # France, UK
"+#$1 (#$2) #$3 #$4 #$5 #$6"
when /^(39|34|49)(\d+)$/ # Italy, Spain, Germany
"+#$1 #$2"
when /^(420)(\d{3})(\d{3})(\d{3})$/ # Czech Republic
"+#$1 #$2 #$3 #$4"
else num # No match - skip formatting
end
end
# ******************************* M A I N *****************************
begin
sys.Log("** Call from #{req.Header.From} to #{req.URI.User} **")
sys.ExtendScriptTimeout(15) # preventing long running dialscript time-out
@t = Time.now + ((Tz+8)*60*60) # Get current time and adjust to local (GMT+3). SS Server is in GMT-8
sys.Log(@t.strftime('Local time: %c'))
if sys.In # If incoming call...
name = req.Header.from.FromURI.User.to_s # Get caller ID
# Prepend 10-digit numbers with "1" (US country code) and remove int'l prefix (if present)
name = ('1' + name) if name =~ /^[2-9]\d\d[2-9]\d{6}$/
name.sub!(/^(\+|00|011)/,'') # Remove international prefixes, if any
prs = req.URI.User.split('.') # parse User into chunks
trunk = prs[-2] # get trunk name
user = prs[-1] # called user name
# Check CNAM first. If not found and US number, try to lookup caller's name in Whitepages
if !(cname = CNAM[name]) && name =~ /^1([2-9]\d\d[2-9]\d{6})$/ && defined?(WP_key)
url = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%3D'http%3A%2F%2Fapi.whitepages.com%2Freverse_phone%2F1.0%2F%3Fphone%3D#{$1}%3Bapi_key%3D#{WP_key}'%20and%20itemPath%3D'wp.listings.listing'&format=json"
if js = sys.WebGet(url,4).to_s
cname, dname, city, state = %w(businessname displayname city state).map {|x| js =~ /"#{x}":"([^"]+)"/; $1}
cname ||= dname; cname ||= "#{city}, #{state}" if city && state
end
end
sys.Log("Caller's number: '#{name}'"); sys.Log("Caller's name: '#{cname}'") if cname
sys.SetFromHeader(formatNum(cname || name), nil, Host) # Set FromName & FromHost for sys.Dial
# Forward call to bindings
# Change FromURI when forwarding to @local, or else Bria won't
# find contact in its phonebook!
callswitch("#{user}@local[fu=#{name}]",45) unless (30..745) === @t.hour*100 + @t.min # forward straight to VM from 0:30a to 7:45a
@code, @reason = 480, "#{user} is asleep" unless @code # if nothing else, must be night hour
@code = 486 if trunk =~ /IPCOMM/i ## *** temporary fix for IPCOMMS ***
else # Outbound call ...
# check if it's URI or phone number.
# If destination's host is in our domain, it's a phone call
num = req.URI.User.to_s; reqHost = req.URI.Host.to_s # Get User and Host
host = reqHost.downcase.slice(/[^:]+/) # Convert to lowercase and delete optional ":port"
num << '@' << reqHost unless Domains.include?(host) # URI dialing unless host is in our domain list
callswitch(num)
end
sys.Respond(@code,@reason) # Forward error code to ATA
rescue
# Gives a lot more details at what went wrong (borrowed from Myatus' dialplan)
sys.Log("** Error: " + $!) unless $!.to_s =~ /Thread was being aborted./
end