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.
- data/.gitignore +0 -0
- data/README.md +2 -0
- data/bin/irckitten +8 -0
- data/lib/irckitten.rb +115 -0
- metadata +51 -0
data/.gitignore
ADDED
File without changes
|
data/README.md
ADDED
data/bin/irckitten
ADDED
data/lib/irckitten.rb
ADDED
@@ -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: []
|