Asterisk direct connect seems functional 😂

This commit is contained in:
2022-10-31 10:10:53 -05:00
parent 4b230eb535
commit a6beae0899
5 changed files with 149 additions and 27 deletions

View File

@@ -7,6 +7,8 @@ require_relative "irc_profile"
class W3DHub
class Asterisk
class IRCClient
TAG = "IRCClient"
class SSL
def self.default_context
verify_peer_and_hostname
@@ -38,24 +40,32 @@ class W3DHub
attr_reader :status
def initialize(irc_profile = nil)
def initialize(irc_profile)
@irc_profile = irc_profile
ssl_context = false
if irc_profile.server_ssl
ssl_context = irc_profile.server_verify_ssl ? SSL.default_context : SSL.no_verify
end
socket = dial(
@irc_profile.server_hostname,
@irc_profile.server_port,
ssl_context: irc_profile.server_ssl ? irc_profile.server_verify_ssl ? SSL.default_context : SSL.no_verify : false
ssl_context: ssl_context
)
authenticate_with_brenbot!(socket)
ensure
socket&.close
close_socket(socket)
end
def dial(hostname, port = 6697, local_host: nil, local_port: nil, ssl_context: SSL.default_context)
Socket.tcp(hostname, port, local_host, local_port).then do |socket|
if ssl_context
ssl_context = SSL.send(ssl_context) if ssl_context.is_a? Symbol
@ssl_socket = true
ssl_context = SSL.send(ssl_context) if ssl_context.is_a?(Symbol)
OpenSSL::SSL::SSLSocket.new(socket, ssl_context).tap do |ssl_socket|
ssl_socket.hostname = hostname
@@ -65,21 +75,22 @@ class W3DHub
socket
end
end
rescue StandardError => e
logger.error(TAG) { e }
logger.error(TAG) { e.backtrace }
end
def authenticate_with_brenbot!(socket)
pp @irc_profile, "#{@irc_profile.nickname}!#{@irc_profile.username.split("/").first}"
# exit
username = @irc_profile.username.empty? ? @irc_profile.nickname : @irc_profile.username
pass = IRCParser::Message.new(command: "PASS", parameters: [@irc_profile.password])
user = IRCParser::Message.new(command: "USER", parameters: [@irc_profile.username, "0", "*", ":#{@irc_profile.nickname}"])
pass = IRCParser::Message.new(command: "PASS", parameters: [Base64.strict_decode64(@irc_profile.password)]) unless @irc_profile.password.empty?
user = IRCParser::Message.new(command: "USER", parameters: [username, "0", "*", ":#{@irc_profile.nickname}"])
nick = IRCParser::Message.new(command: "NICK", parameters: [@irc_profile.nickname])
socket.puts(pass)
socket.puts(user)
socket.puts(nick)
pp socket
socket.flush
until socket.closed?
@@ -93,19 +104,31 @@ class W3DHub
socket.puts("#{pong}")
socket.flush
elsif msg.command == "001" && msg.parameters.join.include?("#{@irc_profile.nickname}!#{@irc_profile.username.split("/").first}")
pm = IRCParser::Message.new(command: "PRIVMSG", parameters: [@irc_profile.server_bot, "!auth #{@irc_profile.bot_auth_username} password"])
pm = IRCParser::Message.new(command: "PRIVMSG", parameters: [@irc_profile.bot_username, "!auth #{@irc_profile.bot_auth_username} #{Base64.strict_decode64(@irc_profile.bot_auth_password)}"])
socket.puts(pm)
quit = IRCParser::Message.new(command: "QUIT", parameters: ["Quiting from an Asterisk"])
socket.puts(quit)
socket.flush
socket.close
sleep 15
close_socket(socket)
elsif msg.command == "ERROR"
close_socket(socket)
end
end
end
def close_socket(socket)
return unless socket
if @ssl_socket
socket.sync_close = true
socket.sysclose
else
socket.close
end
end
end
end
end
W3DHub::Asterisk::IRCClient.new