realtime-slackbot 0.0.1

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e77841f8979e97287c1a7f8705bfdca334f621cc
4
+ data.tar.gz: 20c9f1ba5ae75e56a4a6517f9f749d7c7b1a5083
5
+ SHA512:
6
+ metadata.gz: 893ba30018e9589c33723b6bfa3c6240f8f7581496b622636fcec7c45f6af841e115d0370ff302a5b35d2501d3c2ce964921d7d0d7b380ed3feffaa5c0f61c7e
7
+ data.tar.gz: cd585fa5278926e0d0db1a7a60e5e119a8abceb02be0763635a5c8dfefbd36acf95526748fbd57b57ccc16f793aa7cb5f39136e221d7132af2417dbf6e811d83
@@ -0,0 +1,2 @@
1
+ require_relative 'slack/slack'
2
+ require_relative 'slack/bot'
data/lib/slack/bot.rb ADDED
@@ -0,0 +1,7 @@
1
+ require_relative 'slack'
2
+
3
+ module SlackBot
4
+ class Bot
5
+ include SlackBot
6
+ end
7
+ end
@@ -0,0 +1,58 @@
1
+ class SlackBot::Matcher
2
+ def initialize(msg)
3
+ @message = msg
4
+ @passing = true
5
+ end
6
+
7
+ def from?(user)
8
+ return self unless @passing
9
+ user = user.to_s.downcase
10
+ if @user
11
+ if @user.id == user || @user.name.downcase == user
12
+ res = true
13
+ else
14
+ real = @user.real_name
15
+ res = real == user || real.split(' ').map { |n| user == n }.any?
16
+ end
17
+ else
18
+ res = false
19
+ end
20
+ @passing &&= res
21
+ self
22
+ end
23
+
24
+ def in?(options={})
25
+ return self unless @passing
26
+ res = false
27
+ if options[:id]
28
+ res = @message['channel'] == options[:id]
29
+ elsif options[:name]
30
+ chans = @bot.team_info['channels'].select { |name| ch[id] == channel }
31
+ res = chans.first == options[:name]
32
+ end
33
+ @passing &&= res
34
+ self
35
+ end
36
+
37
+ def include?(text)
38
+ return self unless @passing
39
+ @passing &&= @message['text'].downcase.include? text
40
+ self
41
+ end
42
+
43
+ def match?(reg)
44
+ return self unless @passing
45
+ @passing &&= @message['text'].downcase.match reg
46
+ self
47
+ end
48
+
49
+ def then(&block)
50
+ block.call if @passing
51
+ end
52
+
53
+ def then_reply(*args)
54
+ if @passing
55
+ @message.reply(*args)
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,34 @@
1
+ require 'json'
2
+ require_relative 'matcher'
3
+
4
+ module SlackBot
5
+ class Message
6
+ attr_accessor :user
7
+
8
+ def initialize(data, bot)
9
+ @data = data
10
+ @bot = bot
11
+ @user = bot.user(data['user'])
12
+ end
13
+
14
+ def reply(text)
15
+ @bot.post channel, text
16
+ end
17
+
18
+ def to_s
19
+ "#{@user.name}: #{@data['text']}"
20
+ end
21
+
22
+ def [](key)
23
+ @data[key]
24
+ end
25
+
26
+ def method_missing(name, *args)
27
+ if Matcher.instance_methods.include? name.to_sym
28
+ return Matcher.new(self).send(name, *args)
29
+ else
30
+ @data[name.to_s]
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,116 @@
1
+ require_relative 'user'
2
+ require_relative 'message'
3
+ require 'net/http'
4
+ require 'faye/websocket'
5
+ require 'eventmachine'
6
+ require 'json'
7
+
8
+ module SlackBot
9
+ SLACK_AUTH_URL = 'https://slack.com/api/rtm.start?token='
10
+ attr_accessor :socket
11
+ attr_writer :debug
12
+ attr_reader :team_info
13
+
14
+ def initialize(auth_key, options={})
15
+ @debug = options[:log]
16
+ @key = auth_key.strip
17
+ end
18
+
19
+ def get_url
20
+ data = Net::HTTP.get(URI(SLACK_AUTH_URL + @key))
21
+ json = JSON.parse(data)
22
+ @team_info = json
23
+ json['url']
24
+ end
25
+
26
+ def run
27
+ url = get_url()
28
+ EM.run {
29
+ @socket = ws = Faye::WebSocket::Client.new(url)
30
+
31
+ ws.on :open do |event|
32
+ log(:open, event.to_s)
33
+ hook(:opened)
34
+ end
35
+
36
+ ws.on :message do |event|
37
+ log(:action, event.data)
38
+ begin
39
+ json = JSON.parse(event.data)
40
+ type = json.delete('type')
41
+ if type
42
+ hook(type, Message.new(json, self))
43
+ else
44
+ hook(:unknown, json)
45
+ end
46
+ rescue JSON::ParserError => e
47
+ log(:error, e.message)
48
+ end
49
+
50
+ end
51
+
52
+ ws.on :close do |event|
53
+ log(:close, "#{event.code} #{event.reason}")
54
+ @socket = ws = nil
55
+ hook(:closed)
56
+ end
57
+ }
58
+ end
59
+
60
+ def hook(action, *args)
61
+ if self.respond_to? action
62
+ begin
63
+ send(action, *args)
64
+ rescue Exception => e
65
+ puts e.message
66
+ puts e.backtrace.join "\n"
67
+ end
68
+ end
69
+ end
70
+
71
+ def post(channel, message)
72
+ data = {
73
+ id: 1,
74
+ type: "message",
75
+ channel: channel,
76
+ text: message
77
+ }
78
+ @socket.send data.to_json
79
+ end
80
+
81
+ def reply_to(data, message)
82
+ post(data['channel'], message)
83
+ end
84
+
85
+ def channel(id)
86
+ @team_info['channels'].select { |ch| ch['id'] == id }.first rescue nil
87
+ end
88
+
89
+ def load_users
90
+ users = Hash.new
91
+ (@team_info['users'] + @team_info['bots']).map do |info|
92
+ users[info['id']] = User.new info
93
+ end
94
+ users
95
+ end
96
+
97
+ def users
98
+ @users ||= load_users
99
+ @users.values
100
+ end
101
+
102
+ def user(id)
103
+ @users ||= load_users
104
+ @users[id]
105
+ end
106
+
107
+ def log(type, message)
108
+ if debug?
109
+ puts "#{type}: #{message}"
110
+ end
111
+ end
112
+
113
+ def debug?
114
+ @debug
115
+ end
116
+ end
data/lib/slack/user.rb ADDED
@@ -0,0 +1,50 @@
1
+ module SlackBot
2
+ DEFAULT_ATTRS = [
3
+ :id,
4
+ :team_id,
5
+ :name,
6
+ :deleted,
7
+ :status,
8
+ :color,
9
+ :real_name,
10
+ :tz,
11
+ :tz_label,
12
+ :tz_offset,
13
+ :profile,
14
+ :is_admin,
15
+ :is_owner,
16
+ :is_primary_owner,
17
+ :is_restricted,
18
+ :is_ultra_restricted,
19
+ :is_bot,
20
+ :presence
21
+ ]
22
+ class User
23
+
24
+ def initialize(data)
25
+ @data = data
26
+ end
27
+
28
+ def to_s
29
+ "#{real_name} (#{name})"
30
+ end
31
+
32
+ def pretty_name
33
+ real_name || name
34
+ end
35
+
36
+ def pretty_first_name
37
+ (real_name && real_name.split(' ').first) || name
38
+ end
39
+
40
+ def method_missing(sym)
41
+ if @data.has_key? sym.to_s
42
+ return @data[sym.to_s]
43
+ elsif DEFAULT_ATTRS.include? sym.to_sym
44
+ return nil
45
+ else
46
+ super
47
+ end
48
+ end
49
+ end
50
+ end
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: realtime-slackbot
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Will Richardson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-03-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faye-websocket
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.10'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: eventmachine
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.0'
41
+ description: Library for making realtime bots and responding to messages
42
+ email: william.hamish@gmail.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - lib/realtime-slackbot.rb
48
+ - lib/slack/bot.rb
49
+ - lib/slack/matcher.rb
50
+ - lib/slack/message.rb
51
+ - lib/slack/slack.rb
52
+ - lib/slack/user.rb
53
+ homepage: http://github.com/javanut13/realtime-slackbot
54
+ licenses:
55
+ - MIT
56
+ metadata: {}
57
+ post_install_message:
58
+ rdoc_options: []
59
+ require_paths:
60
+ - lib
61
+ required_ruby_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ required_rubygems_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ requirements: []
72
+ rubyforge_project:
73
+ rubygems_version: 2.4.8
74
+ signing_key:
75
+ specification_version: 4
76
+ summary: Slackbot realtime API
77
+ test_files: []