zoe 0.1.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b988b2f87d957cf3462b4817a8f9141b043443dc
4
+ data.tar.gz: e53f30ffcfec1fc9c9effca0b95dc02ed74d2e91
5
+ SHA512:
6
+ metadata.gz: 196ebc587400cb8222063c012687b4cd0a94d236e51036161826a59bb19298587c32abde3a6bbcbd91bb4a9c1fd6eee5af87c4f731fa518f927df1117e80327a
7
+ data.tar.gz: 2867848cbd854d035ef3066a4925b9d0d68f3824f8ee963b3ad3a6e7ed793482704ff2216f352af84c1dae898c9727e56c0964cc344e2d1a152ab83a3a7ba2b3
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gemspec
@@ -0,0 +1,18 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ zoe (0.1.0)
5
+ xmpp4r (~> 0.5.0)
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ rake (10.0.4)
11
+ xmpp4r (0.5)
12
+
13
+ PLATFORMS
14
+ ruby
15
+
16
+ DEPENDENCIES
17
+ rake
18
+ zoe!
@@ -0,0 +1,19 @@
1
+ Usage
2
+ =====
3
+
4
+ ```ruby
5
+ require 'zoe'
6
+
7
+ Zoe.connect(:jid => 'account@domain',
8
+ :password => 'password',
9
+ :rooms => ['room_jid'])
10
+
11
+
12
+ Zoe.on_message do |m|
13
+ puts m.to_me?
14
+ puts m.from
15
+ puts m.reply_to
16
+ puts m.to
17
+ puts m.body
18
+ end
19
+ ``ruby
@@ -0,0 +1,8 @@
1
+ require 'bundler/setup'
2
+ require "bundler/gem_tasks"
3
+ Bundler.require(:development)
4
+
5
+ task :console do
6
+ exec 'irb -I lib -r zoe.rb'
7
+ end
8
+ task :c => :console
@@ -0,0 +1,77 @@
1
+ require 'xmpp4r'
2
+ require 'xmpp4r/muc'
3
+ require 'xmpp4r/roster'
4
+
5
+ require 'singleton'
6
+ require 'zoe/jabber'
7
+ require 'zoe/rexml_patches'
8
+
9
+ class Zoe
10
+ include Singleton
11
+
12
+ attr_reader :client, :roster, :rooms, :callbacks
13
+
14
+ def initialize
15
+ @callbacks = []
16
+ end
17
+
18
+ def connect(jid: nil, password: nil, rooms: [])
19
+ @jid = jid
20
+ @client = Jabber::Client.new(jid + '/bot')
21
+
22
+ @client.connect
23
+ @client.auth(password)
24
+ @client.send(Jabber::Presence.new.set_type(:available))
25
+
26
+ @roster = Jabber::Roster::Helper.new(@client)
27
+ @roster.wait_for_roster
28
+
29
+ @rooms = rooms.map do |room_name|
30
+ room = Jabber::MUC::MUCClient.new(@client)
31
+ room.join(room_name + '/' + self.jid.iname)
32
+ room
33
+ end
34
+
35
+ @client.add_message_callback(200) do |m|
36
+ if m.type == :chat # if PM
37
+ m.reply_to = m.from
38
+ elsif m.type == :groupchat && m.from.resource # if GM
39
+ m.reply_to = m.from
40
+ m.from = get_jid_by_name(m.from.resource)
41
+ end
42
+
43
+ if m.body
44
+ @callbacks.each{ |c| c.call(m) }
45
+ end
46
+ end
47
+ end
48
+
49
+ def jid
50
+ @roster[@jid]
51
+ end
52
+
53
+ def get_jid_by_name(name)
54
+ @roster.items.values.find{ |v| v.iname == name }
55
+ end
56
+
57
+ def send(to, message)
58
+ to = to.is_a?(Jabber::JID) ? to : Jabber::JID.new(to.to_s)
59
+ message = Jabber::Message.new(to, message)
60
+ message.type = (to.domain == "conf.hipchat.com" ? :groupchat : :chat)
61
+
62
+ @client.send(message)
63
+ end
64
+
65
+ def on_message(&block)
66
+ @callbacks << block
67
+ end
68
+
69
+ def debug!
70
+ Jabber.logger = Logger.new(STDOUT)
71
+ Jabber.debug = true
72
+ end
73
+
74
+ def self.method_missing(method, *args, &block)
75
+ instance.__send__(method, *args, &block)
76
+ end
77
+ end
@@ -0,0 +1,13 @@
1
+ class Jabber::Message
2
+ attr_accessor :reply_to
3
+
4
+ def to_me?
5
+ !!( body =~ /(^|\s)@#{Zoe.jid.nick}(\s|$)/i || from.strip.to_s == reply_to.strip.to_s)
6
+ end
7
+ end
8
+
9
+ class Jabber::Roster::Helper::RosterItem
10
+ def nick
11
+ attributes['mention_name']
12
+ end
13
+ end
@@ -0,0 +1,26 @@
1
+ # Encoding patch, stolen from https://github.com/ln/xmpp4r/issues/3#issuecomment-1739952
2
+ require 'socket'
3
+ class TCPSocket
4
+ def external_encoding
5
+ Encoding::BINARY
6
+ end
7
+ end
8
+
9
+ require 'rexml/source'
10
+ class REXML::IOSource
11
+ alias_method :encoding_assign, :encoding=
12
+ def encoding=(value)
13
+ encoding_assign(value) if value
14
+ end
15
+ end
16
+
17
+ begin
18
+ # OpenSSL is optional and can be missing
19
+ require 'openssl'
20
+ class OpenSSL::SSL::SSLSocket
21
+ def external_encoding
22
+ Encoding::BINARY
23
+ end
24
+ end
25
+ rescue
26
+ end
@@ -0,0 +1,23 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'zoe'
3
+ s.version = '0.1.0'
4
+ s.authors = ['Jon Bracy']
5
+ s.email = ['jon@42floors.com']
6
+ s.homepage = 'http://github.com/42floors/zoe'
7
+ s.summary = 'A HipChat Bot'
8
+ s.description = 'A simple chat bot for HipChat'
9
+ s.license = 'MIT'
10
+
11
+ s.rubyforge_project = 'zoe'
12
+
13
+ s.files = `git ls-files`.split("\n")
14
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
16
+ s.require_paths = ["lib"]
17
+
18
+ # Developoment
19
+ s.add_development_dependency 'rake'
20
+
21
+ # Runtime
22
+ s.add_runtime_dependency 'xmpp4r', '~> 0.5.0'
23
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: zoe
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jon Bracy
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-06-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: xmpp4r
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 0.5.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 0.5.0
41
+ description: A simple chat bot for HipChat
42
+ email:
43
+ - jon@42floors.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - Gemfile
49
+ - Gemfile.lock
50
+ - README.md
51
+ - Rakefile
52
+ - lib/zoe.rb
53
+ - lib/zoe/jabber.rb
54
+ - lib/zoe/rexml_patches.rb
55
+ - zoe.gemspec
56
+ homepage: http://github.com/42floors/zoe
57
+ licenses:
58
+ - MIT
59
+ metadata: {}
60
+ post_install_message:
61
+ rdoc_options: []
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - '>='
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ requirements: []
75
+ rubyforge_project: zoe
76
+ rubygems_version: 2.0.3
77
+ signing_key:
78
+ specification_version: 4
79
+ summary: A HipChat Bot
80
+ test_files: []