Just installed the local version & cant get GV to work.
Hmm, I would understand why Int worked with Home/Work/Mobile but Gizmo is certainly different. One of my callback numbers is Gizmo and passing type 7 (Integer) with this number certainly works (checked a few minutes ago). So, either actual code running on Sipsorcery is different from codeplex or Google ignores phone type overall.
Woohoo!!!! It is all working!!!!! Sipgate was working, but not gizmo. Turns out the gizmo number needs a + in front of it. Then gizmo worked too. I have a alabrate diaplan. one that routes through voipstunt when I make a international call... So here is the meat of the plan... @num is the number that is called after all the processing.... I just threw in the @num = req.URI.User.to_s to make this functional for someone else without using my whole dialplan
Code: Select all
GV_USER = "xxxx@gmail.com" # my GV e-mail address (user@gmail.com)
GV_PASS = "xxxxxx" # my GV password
SIPGATE_NUMBER = "1704xxxxxxx" # my 10-digit Sipgate number
GIZMO5_NUMBER = "+1747xxxxxxx" # my Gizmo Number
GV_NUMBER= "818xxxxxxx" # my Google Voice number
@num = req.URI.User.to_s
def googleVoiceG5
sys.Log("Trying Google Voice Gizmo5 \t")
sys.GoogleVoiceCall(GV_USER,GV_PASS, GIZMO5_NUMBER,@num, GV_NUMBER,"7")
end
def googleVoiceSip
sys.Log("Trying Google Voice sipgate \t")
sys.GoogleVoiceCall(GV_USER,GV_PASS, SIPGATE_NUMBER,@num, GV_NUMBER,"3")
end
case @num
when /^1([2-9]\d\d)/ # North America
case $1 # check area code
# sipgate-to-US toll-free are no cost
# the following line will cause such calls to be made directly via sipgate, bypassing Google Voice
when /(800|866|877|888)/ # US toll-free and sipgate-to-sipgate calls
sys.Dial("${@num}@sipgate")
else
googleVoiceG5
googleVoiceSip
end
The source at codeplex defines phone type as integer and hence I would assume that you need to pass in an integer at sipsorcery.com. But the patch is defining the phone type as string and hence you will need to pass phone type as a string on the local version with the patch.MikeTelis wrote:Hmm, I would understand why Int worked with Home/Work/Mobile but Gizmo is certainly different. One of my callback numbers is Gizmo and passing type 7 (Integer) with this number certainly works (checked a few minutes ago). So, either actual code running on Sipsorcery is different from codeplex or Google ignores phone type overall.
When you say, you checked few minutes ago, did you mean on the local version with the patch or on sipsorcery.com
I am glad its working now and thanks for the tip of placing + for gizmo. However I think Gizmo callback is not working at the moment for me. May be they are changing some thing again.jaminmc wrote:Woohoo!!!! It is all working!!!!! Sipgate was working, but not gizmo. Turns out the gizmo number needs a + in front of it. Then gizmo worked too.
I got it to work on the local version. and my dialplan is similar to the one posted before....
Here is my actual Dialplan.
Here is my actual Dialplan.
Code: Select all
#============================= BEGIN CODE ======================================#
#Ruby
# Note: This is the Gizmo and Sipgate script.
# I have it set to use the Gizmo first, if that one fails, it will use sipgate.
# --------BEGIN MANDATORY ENTRIES SECTION---------------------------------------#
Area = '803' # my area code, this will be added to 7-digit dialouts
Tz = -5 # my time zone (GMT format, e.g. Central = -6)
# ---- Enter your Google Voice ("GV") and Sipgate account credentials----#
GV_USER = "xxxx@gmail.com" # my GV e-mail address (user@gmail.com)
GV_PASS = "xxxx" # my GV password
SIPGATE_NUMBER = "1704xxxxxxx" # my 10-digit Sipgate number
GIZMO5_NUMBER = "+1747xxxxxxx"
GV_NUMBER= "818xxxxxxx"
# --------END MANDATORY ENTRIES SECTION-----------------------------------------#
# --------BEGIN OPTIONAL SECTION FOR SPEED DIAL---------------------------------#
# Speed dial entries. Format: "short code" => "destination (POTS or SIP)"
Speeddial = {
'411' => '8004664411', # Google's Directory Assistance, GOOG-411
'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' => '8009328437', # 800-WEATHERCALL (9328437 = "WEA[ther]")
'369' => '2129040080@podlinez.net', # "FOX" Radio News
'2455' => '6414539074@podlinez.net', # "BILL" Johnson podcast
}
# --------END OPTIONAL SPEED DIAL ENTRY SECTION---------------------------------#
# Serviced domains, must be in lowercase!
Domains = ['My Local.homeip.net',"192.168.1.103",'xx.10.179.xx','sipgate.com','sip.sipgate.com'] #put sipgate in there so if I redial from my softphone, it will go through...
# Excluded Prefixes. Provides a safeguard against accidentally calling premium
# numbers. Accepts both strings and patterns, spaces ignored
ExcludedPrefixes = [
' 1 (900 | 976 | 809)', # USA Premium
'44 (9 | 55 | 87 (0|1))', # UK Premium
'44 84 (4|5)', # UK Local Premium
'44 70', # UK Personal Premium
'43 (8|9)', # Austria Premium
'32 (7|90)', # Belgium Premium
'45 (1 | 50 (1|2|3) | 70 (1|2))', # Denmark Premium
'45 (8|9) 0', # Denmark Premium (...)
'33 (7|9)', # France Premium
'49 (1 | 900)', # Germany Premium
'39 [^3]', # Italy Premium (...)
'31 (14 | 6 (3|8|9) | 8 | 9)', # Netherlands Premium (...)
'48 (39 | (2|7|8) 0)', # Poland Premium
'46 9 (00 | 39 | 44)', # Sweden Premium
'41 90 (0|1|6)', # Switzerland Premium
]
# Providers: "key" => "template". Template format: prefix@Provider
VSPtab = {
'0' => '@ voipstunt', # Future-nine default route
'2' => '@ voipstunt', # Future-nine grey route
'3' => '@ voipstunt', # Future-nine white route
'4' => '@ voipstunt', # Future-nine premium route
'5' => '@ sipgate', # sipgate
}
# ******************** G o o g l e V o i c e *****************************
# !!!!!!!!!!!! Make sure to enter your credentials below !!!!!!!!!!!!!
# Note: enter the middle line on one line. My comments wrapped it to the second line
# Note 2: The "@num" in the parameter list is the only parameter that is not surrounded by
# single quotes
def googleVoiceSip
sys.Log("Trying Google Voice sipgate \t")
sys.GoogleVoiceCall(GV_USER,GV_PASS, SIPGATE_NUMBER,@num, GV_NUMBER,"3")
end
def googleVoiceG5
sys.Log("Trying Google Voice Gizmo5 \t")
sys.GoogleVoiceCall(GV_USER,GV_PASS, GIZMO5_NUMBER,@num, GV_NUMBER,"7")
end
# ******************** s e l e c t V S P *******************************
def selectVSP # VoIP provider selection
# Reject calls to premium numbers unless VSP was forced
ExcludedPrefixes.each {|p| p.gsub!(/\s*/,''); sys.Respond(503,"Calls to #{$1}* not allowed") if @num =~ Regexp.new("^(#{p})")}
case @num
when /^1([2-9]\d\d)/ # North America
case $1 # check area code
# when "808", "907", "867" # AK, HI, Canada Yukon calls are now free with GV
# route(4,"Destination - Alaska, Hawaii, Yukon")
# sipgate-to-sipgate and sipgate-to-US toll-free are no cost
# the following line will cause such calls to be made directly via sipgate, bypassing Google Voice
when /(800|866|877|888)/ # US toll-free and sipgate-to-sipgate calls
route(5,"Destination - US toll-free or sipgate")
sys.Log("Destination - US toll-free or sipgate\t")
else
googleVoiceG5
googleVoiceSip
sys.Log("GoogleVoiceCall failed, routing thru F9")
# route(0,"Destination - North America")
end
when /^972(5|6)/ # Israel mobile
route(0,"Destination - Israel mobile")
else
route(0,"Default route applied")
end
end
# ************************** C A L L S W I T C H **********************
def callswitch(num,*args)
route # Initialize vars
@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
@num.gsub!(/%(..)/) {$1.to_i(16).chr} # Convert %hh into ASCII
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
sys.Respond(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?
# Invoke selectVSP prior to ENUM lookup just in case we need to modify @num
route # re-initialize variables
selectVSP # Pick appropriate provider for the call
if enumuri = sys.ENUMLookup("+#{@num}.e164.org") # Check if NAPTR exists for the number
sys.Log("ENUM entry found: '#{enumuri}'") # If yes, call that URI
sys.Dial(enumuri) # if call failed, call via regular VSP.
status() # If this is not what you want, add "return"
sys.Log("Call to #{enumuri} failed (#{@reason}), will call again via regular VoIP provider")
end
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
# ****************************** R O U T E *******************************
def route(p='', l='')
@p = p; @l = l
end
# ***************************** S T A T U S ******************************
def status
if (ptr = sys.LastDialled[0]).nil?
@code = 487; @reason = 'Cancelled by Sipsorcery'
else
ptr = ptr.TransactionFinalResponse
@code = ptr.StatusCode; @reason = ptr.ReasonPhrase
# sys.Log("#{ptr.ToString()}")
end
end
# ******************************* M A I N *****************************
begin
sys.Log("** Call from #{req.Header.From.ToString()} to #{req.URI.User} **")
t = Time.now + ((Tz+8)*60*60) # Get current time and adjust to local. 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 a copy of caller's number
# Prefix 10-digit numbers with "1" (US country code).
# Some DID send Caller ID without country code
name = ('1' + name) if name =~ /^[2-9]\d\d[2-9]\d{6}$/
name.sub!(/^011/,'') # Remove 011 prefix added by Google Voice
sys.Log("FromName: '#{name}'")
req.Header.From.FromName = name # Set FromName for sys.Dial
# Change FromURI.User, too - or else Bria won't find contact in its phonebook!
req.Header.from.FromURI.User = name
# if sys.IsAvailable() # If my ATA is registered
callswitch("#{sys.Username}@local") # forward all incoming calls to it
# elsif (8..23) === t.hour # else forward calls to my home
# sys.Log("#{sys.Username} is not online, forwarding call to home number...")
# callswitch("0",35) # Note that '0' is in my speed dial list
# end
sys.Respond(480, "#{sys.Username} Not online") # switch to voice mail
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.find {|x| x == 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