irckitten 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (5) hide show
  1. data/.gitignore +0 -0
  2. data/README.md +2 -0
  3. data/bin/irckitten +8 -0
  4. data/lib/irckitten.rb +115 -0
  5. metadata +51 -0
File without changes
@@ -0,0 +1,2 @@
1
+ Ruby gem to do IRCCat based on SRV records. No longer do you have to
2
+ configure shit, that's what DNS is for.
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ lib = File.expand_path('../../lib', __FILE__)
4
+ $:.unshift(lib) unless $:.include?(lib)
5
+
6
+ require 'irckitten'
7
+
8
+ IrcKitten::msg ARGV.join ' '
@@ -0,0 +1,115 @@
1
+ #!/usr/bin/env - ruby
2
+ #
3
+
4
+ require 'socket'
5
+ require 'resolv'
6
+
7
+ ## These are only used in development.
8
+ # require 'rubygems'
9
+ # require 'profile'
10
+ # require 'awesome_print'
11
+ # require 'pry'
12
+
13
+ # This is to use system_timer if it's there on 1.8.7, or Timeout as a fall
14
+ # back. On 1.9.x just use timeout.
15
+ # http://davidvollbracht.com/blog/30-days-of-tech-day-1-systemtimer
16
+ # http://ph7spot.com/musings/system-timer
17
+ if RUBY_VERSION =~ /1\.8\./
18
+ begin
19
+ require 'rubygems'
20
+ require 'system_timer'
21
+ MyTimer = SystemTimer
22
+ rescue LoadError
23
+ require 'timeout'
24
+ MyTimer = Timeout
25
+ end
26
+ else
27
+ # 1.9 Timeout works.
28
+ require 'timeout'
29
+ MyTimer = Timeout
30
+ end
31
+
32
+
33
+ module IrcKitten
34
+
35
+ DNSRECORD = "_irccat._tcp."
36
+
37
+ def msg( message )
38
+
39
+ self.getsrvrecords.each do |addy|
40
+ return true \
41
+ if self.sendmessage( message , addy.target.to_s , addy.port )
42
+ end
43
+
44
+ false
45
+ end
46
+
47
+ private
48
+
49
+ def self.givemedomains
50
+ @myhostname ||= Socket.gethostname
51
+ currentdomain = @myhostname
52
+
53
+ domain = []
54
+ while currentdomain != nil
55
+ currentdomain = self.dropazone( currentdomain )
56
+ domain << currentdomain
57
+ end
58
+ domain
59
+ end
60
+
61
+ # I think this works in a funcitonal programming kinda way.
62
+ # When you run out it should return nil
63
+ def self.dropazone( rr )
64
+ bits = rr.split '.'
65
+ return nil if bits.empty?
66
+ bits[1,bits.size].join('.')
67
+ end
68
+
69
+ def self.sendmessage( message , host , port )
70
+ s = nil
71
+
72
+ begin
73
+ MyTimer.timeout( 10 ) do
74
+ s = TCPSocket.new host, port
75
+ s.puts message
76
+ end
77
+ rescue Timeout::Error
78
+ $stderr.puts "Timed out talking to #{host}:#{port}"
79
+ return false
80
+ ensure
81
+ s.close unless s.nil?
82
+ end
83
+
84
+ true
85
+ end
86
+
87
+ # Get the SRV records from DNS, uses the constant to add to each
88
+ # domain to get the record to try. Returns a vaguely sorted thing.
89
+ def self.getsrvrecords
90
+
91
+ srvs = nil
92
+ begin
93
+ Resolv::DNS.open do |dns|
94
+ self.givemedomains.each do |domain|
95
+ srvs = dns.getresources( DNSRECORD + domain , Resolv::DNS::Resource::IN::SRV)
96
+ break unless srvs.nil?
97
+ end
98
+ end
99
+
100
+ # Don't bother sorting them if we just have one!
101
+ return srvs if srvs.size == 1
102
+
103
+ srvs.sort! { |a,b| (a.priority != b.priority) ? (a.priority <=> b.priority) : (b.weight <=> a.weight) }
104
+
105
+ rescue NameError => e
106
+ $stderr.puts "Problem resolving DNS due to #{e}."
107
+ end
108
+
109
+ srvs
110
+ end
111
+
112
+ # Expose these module methods.
113
+ module_function :msg
114
+
115
+ end
metadata ADDED
@@ -0,0 +1,51 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: irckitten
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ben Hughes
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-08-15 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: ! "Send message to IRC via IRCCat, but without having\n to manually
15
+ configure a server in your code. Just use DNS as RFC822\n intended."
16
+ email:
17
+ - ben@mumble.org.uk
18
+ executables:
19
+ - irckitten
20
+ extensions: []
21
+ extra_rdoc_files: []
22
+ files:
23
+ - .gitignore
24
+ - README.md
25
+ - bin/irckitten
26
+ - lib/irckitten.rb
27
+ homepage: https://github.com/barn/irckitten
28
+ licenses: []
29
+ post_install_message:
30
+ rdoc_options: []
31
+ require_paths:
32
+ - lib
33
+ required_ruby_version: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ required_rubygems_version: !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ requirements: []
46
+ rubyforge_project:
47
+ rubygems_version: 1.8.23
48
+ signing_key:
49
+ specification_version: 3
50
+ summary: Module to talk simple IRCCat based on SRV DNS records
51
+ test_files: []