realtime-slackbot 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []