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 +7 -0
- data/lib/realtime-slackbot.rb +2 -0
- data/lib/slack/bot.rb +7 -0
- data/lib/slack/matcher.rb +58 -0
- data/lib/slack/message.rb +34 -0
- data/lib/slack/slack.rb +116 -0
- data/lib/slack/user.rb +50 -0
- metadata +77 -0
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
|
data/lib/slack/bot.rb
ADDED
@@ -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
|
data/lib/slack/slack.rb
ADDED
@@ -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: []
|