balotelli 0.4.1 → 0.4.2.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 +4 -4
- data/.travis.yml +9 -0
- data/Gemfile.lock +2 -3
- data/lib/balotelli/base.rb +49 -33
- data/lib/balotelli/core/irc_logger.rb +32 -24
- data/lib/balotelli/core/join.rb +8 -5
- data/lib/balotelli/core/priv_msg.rb +5 -9
- data/lib/balotelli/core/router.rb +1 -1
- data/lib/balotelli/core/utils.rb +8 -0
- data/lib/balotelli/version.rb +1 -1
- data/test/lib/balotelli/core/router_test.rb +1 -1
- data/test/lib/balotelli/core/utils_test.rb +22 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7addde5a832912208f7790a6559c172d818a555a
|
4
|
+
data.tar.gz: 0a86ccc08b3e928152d024d9e8e154aa36cdbf46
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a252b2a40886641e5912b5818416a53d014b3c2b1a026f9a688153c1a5397d162be1da2d4b755a36250ee27487cbe5526940eba3a77108c90a59b11982d18168
|
7
|
+
data.tar.gz: 9f37a6595af818d752e9cfcdd7814ad183ccf09364b6b36f6445ca8137e3b685bfdacd64cb9c1b809ec0307eccfc1f5910bdab42dfba919e1f59dfaa245d6450
|
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
data/lib/balotelli/base.rb
CHANGED
@@ -9,19 +9,20 @@ require 'balotelli/config'
|
|
9
9
|
|
10
10
|
module Balotelli
|
11
11
|
class Base
|
12
|
-
|
13
|
-
|
12
|
+
extend Core::Utils::ClassVariableGetter
|
13
|
+
class_variable_get :cache, :cvs, :mutex
|
14
|
+
|
15
|
+
def initialize(block, message, matchdata)
|
14
16
|
@message = message
|
15
17
|
@block = block
|
16
|
-
@
|
17
|
-
@command = command
|
18
|
-
@matchdata = @command.match(@route)
|
18
|
+
@matchdata = matchdata
|
19
19
|
end
|
20
20
|
|
21
|
-
def execute
|
21
|
+
def execute!
|
22
22
|
instance_exec(@message, @matchdata, &@block)
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
|
+
alias execute execute!
|
25
26
|
|
26
27
|
def out(message_string, destination = nil)
|
27
28
|
self.class.privmsg((destination || @message.responder), message_string)
|
@@ -35,19 +36,20 @@ module Balotelli
|
|
35
36
|
execute_in_mutex(channel) do
|
36
37
|
self.class.names(channel)
|
37
38
|
end
|
38
|
-
|
39
|
+
cache[:user_list][channel]
|
39
40
|
end
|
40
41
|
|
41
42
|
def execute_in_mutex(channel)
|
42
43
|
cv = ConditionVariable.new
|
43
|
-
if
|
44
|
-
|
44
|
+
if cvs.key? channel
|
45
|
+
cvs[channel] << cv
|
45
46
|
else
|
46
|
-
|
47
|
+
cvs[channel] = [cv]
|
47
48
|
end
|
48
49
|
yield
|
49
|
-
|
50
|
+
mutex.synchronize { cv.wait(mutex) }
|
50
51
|
end
|
52
|
+
private :execute_in_mutex
|
51
53
|
|
52
54
|
def method_missing(method, *args, **params, &block)
|
53
55
|
if method =~ /__([[[:upper:]]_]+)__/
|
@@ -93,6 +95,8 @@ module Balotelli
|
|
93
95
|
def mod_match(str, priv = false)
|
94
96
|
if str =~ /\A[^a-zA-Z0-9\s]?(\S+) ?(.*)/
|
95
97
|
if (mod = @cache[:modules][Regexp.last_match(1).downcase])
|
98
|
+
str.slice!(0..Regexp.last_match(1).length)
|
99
|
+
str.lstrip!
|
96
100
|
mod.match(Regexp.last_match(2), priv)
|
97
101
|
end
|
98
102
|
elsif str == :join
|
@@ -128,40 +132,52 @@ module Balotelli
|
|
128
132
|
|
129
133
|
def process_message(str)
|
130
134
|
if str =~ Core::Utils::PRIV_MSG_REGEX
|
131
|
-
|
132
|
-
priv = !(Regexp.last_match(2) =~ /#.+/)
|
133
|
-
if (match = match(metadata[:message], priv)) ||
|
134
|
-
(match = mod_match(metadata[:message], priv))
|
135
|
-
new_response(str, match, metadata, Core::PrivMsg, priv)
|
136
|
-
end
|
135
|
+
process_private_message(str, *Regexp.last_match[1..3])
|
137
136
|
elsif str =~ Core::Utils::JOIN_REGEX
|
138
|
-
|
139
|
-
if (match = match(:join)) || (match = mod_match(:join))
|
140
|
-
new_response(str, match, metadata, Core::Join)
|
141
|
-
end
|
137
|
+
process_join(str, *Regexp.last_match[1..2])
|
142
138
|
end
|
143
139
|
end
|
144
140
|
|
145
|
-
def
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
end
|
141
|
+
def process_private_message(str, user, channel, message)
|
142
|
+
privacy = !(channel =~ /#.+/)
|
143
|
+
if (route = match(message, privacy)) ||
|
144
|
+
(route = mod_match(message, privacy))
|
145
|
+
new_response(user, channel, message, route, Core::PrivMsg, privacy)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def process_join(str, user, channel)
|
150
|
+
if (route = match(:join)) || (route = mod_match(:join))
|
151
|
+
new_response(user, channel, nil, route, Core::Join)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
|
156
|
+
def new_response(user, channel, message, route_match, klass, priv = nil)
|
157
|
+
route_pattern, block, module_name = route_match.flatten
|
158
|
+
message = klass.new(*[user, channel, message, priv].compact)
|
159
|
+
matchdata = message.content.match(route_pattern) if route_pattern.is_a?(Regexp)
|
160
|
+
new(block, message, matchdata).tap do |response|
|
161
|
+
response.extend(module_name) if module_name.class.to_s == 'Module'
|
162
|
+
end.execute!
|
151
163
|
end
|
152
164
|
|
153
165
|
def process_table(string)
|
154
166
|
if @cvs.any? && string =~ (regex = Core::Utils.table_regex(@nick))
|
155
|
-
|
156
|
-
users =
|
167
|
+
channel = Regexp.last_match(2)
|
168
|
+
users = Regexp.last_match(3)
|
157
169
|
until (str = sgets) =~ %r{End of \/NAME}i
|
158
170
|
users << " #{str.match(regex).captures.first}"
|
159
171
|
end
|
160
|
-
@cache[:user_list][
|
161
|
-
|
162
|
-
@cvs.delete(metadata[:channel]) if @cvs[metadata[:channel]].empty?
|
172
|
+
@cache[:user_list][channel] = users.split(' ')
|
173
|
+
signal_cvs(channel)
|
163
174
|
end
|
164
175
|
end
|
176
|
+
|
177
|
+
def signal_cvs(channel)
|
178
|
+
@cvs[channel].shift.signal
|
179
|
+
@cvs.delete(channel) if @cvs[channel].empty?
|
180
|
+
end
|
165
181
|
end
|
166
182
|
end
|
167
183
|
end
|
@@ -23,37 +23,19 @@ module Balotelli
|
|
23
23
|
def included(des)
|
24
24
|
super
|
25
25
|
|
26
|
-
define_log_method
|
27
|
-
|
28
26
|
des.instance_variable_set(:@log_file, log_file)
|
29
27
|
des.instance_variable_set(:@logger, self)
|
28
|
+
|
29
|
+
define_log_method
|
30
|
+
|
30
31
|
class << des
|
31
32
|
alias_method :orig_sputs, :sputs
|
32
33
|
private :orig_sputs
|
33
34
|
|
34
|
-
def sputs(str)
|
35
|
-
orig_sputs(str)
|
36
|
-
to_log = ">>#{str.inspect}\n"
|
37
|
-
@log_file.info(to_log)
|
38
|
-
if str =~ /\A:?\S+ (#\S+) .*/
|
39
|
-
@logger.channel_log(Regexp.last_match(1).downcase, to_log)
|
40
|
-
end
|
41
|
-
str
|
42
|
-
end
|
43
|
-
|
44
35
|
alias_method :orig_sgets, :sgets
|
45
36
|
private :orig_sgets
|
46
|
-
|
47
|
-
def sgets
|
48
|
-
str = orig_sgets
|
49
|
-
to_log = "<<#{str.inspect}\n"
|
50
|
-
@log_file.info(to_log)
|
51
|
-
if str =~ /\A:?\S+ \S+ (#\S+) .*/
|
52
|
-
@logger.channel_log(Regexp.last_match(1).downcase, to_log)
|
53
|
-
end
|
54
|
-
str
|
55
|
-
end
|
56
37
|
end
|
38
|
+
des.extend(Methods)
|
57
39
|
end
|
58
40
|
|
59
41
|
def channel_log(channel, to_log)
|
@@ -62,16 +44,42 @@ module Balotelli
|
|
62
44
|
end
|
63
45
|
end
|
64
46
|
|
65
|
-
|
47
|
+
module Methods
|
48
|
+
def sgets
|
49
|
+
str = orig_sgets
|
50
|
+
to_log = "<<#{str.inspect}\n"
|
51
|
+
@log_file.info(to_log)
|
52
|
+
if str =~ /\A:?\S+ \S+ (#\S+) .*/
|
53
|
+
@logger.channel_log(Regexp.last_match(1).downcase, to_log)
|
54
|
+
end
|
55
|
+
str
|
56
|
+
end
|
57
|
+
|
58
|
+
def sputs(str)
|
59
|
+
orig_sputs(str)
|
60
|
+
to_log = ">>#{str.inspect}\n"
|
61
|
+
@log_file.info(to_log)
|
62
|
+
if str =~ /\A:?\S+ (#\S+) .*/
|
63
|
+
@logger.channel_log(Regexp.last_match(1).downcase, to_log)
|
64
|
+
end
|
65
|
+
str
|
66
|
+
end
|
67
|
+
end
|
66
68
|
|
67
69
|
def define_log_method
|
70
|
+
define_method :log_file do |str|
|
71
|
+
class_variable_get(:@log_file)
|
72
|
+
end
|
73
|
+
|
68
74
|
define_method :log do |str|
|
69
75
|
log_string = "LOG: #{str.inspect}\n"
|
70
|
-
|
76
|
+
log_file.info log_string
|
71
77
|
puts log_string
|
72
78
|
end
|
73
79
|
end
|
74
80
|
|
81
|
+
private
|
82
|
+
|
75
83
|
def channel_log_file(channel)
|
76
84
|
"#{channel.tr('#', '')}_logs.log"
|
77
85
|
end
|
data/lib/balotelli/core/join.rb
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
module Balotelli
|
2
2
|
module Core
|
3
3
|
class Join
|
4
|
-
attr_reader :user, :channel, :user_nick
|
5
|
-
def initialize(
|
6
|
-
@user =
|
4
|
+
attr_reader :user, :channel, :user_nick
|
5
|
+
def initialize(user, channel)
|
6
|
+
@user = user
|
7
7
|
@user_nick = Core::Utils.nick_from_user(@user)
|
8
|
-
@channel =
|
9
|
-
|
8
|
+
@channel = channel
|
9
|
+
end
|
10
|
+
|
11
|
+
def responder
|
12
|
+
@channel
|
10
13
|
end
|
11
14
|
end
|
12
15
|
end
|
@@ -2,16 +2,12 @@ module Balotelli
|
|
2
2
|
module Core
|
3
3
|
class PrivMsg
|
4
4
|
attr_reader :user, :channel, :content, :user_nick, :responder
|
5
|
-
def initialize(
|
6
|
-
@user =
|
5
|
+
def initialize(user, channel, message, privacy = false)
|
6
|
+
@user = user
|
7
7
|
@user_nick = @user.match(/\A(\S+)!.*/)[1]
|
8
|
-
@channel =
|
9
|
-
@content =
|
10
|
-
@responder =
|
11
|
-
@user_nick
|
12
|
-
else
|
13
|
-
@channel
|
14
|
-
end
|
8
|
+
@channel = channel
|
9
|
+
@content = message
|
10
|
+
@responder = privacy ? @user_nick : @channel
|
15
11
|
end
|
16
12
|
end
|
17
13
|
end
|
data/lib/balotelli/core/utils.rb
CHANGED
@@ -14,6 +14,14 @@ module Balotelli
|
|
14
14
|
def table_regex(nick)
|
15
15
|
/\A:?(\S+) \d+ #{nick} \S (#\S+) :?(.*)/
|
16
16
|
end
|
17
|
+
|
18
|
+
module ClassVariableGetter
|
19
|
+
def class_variable_get(*args)
|
20
|
+
args.each do |s|
|
21
|
+
define_method(s) { self.class.instance_variable_get("@#{s}") }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
17
25
|
end
|
18
26
|
end
|
19
27
|
end
|
data/lib/balotelli/version.rb
CHANGED
@@ -20,7 +20,7 @@ class RouterTest < Minitest::Test
|
|
20
20
|
def test_it_mathes_routes
|
21
21
|
lam = -> { puts 'kk' }
|
22
22
|
@route.on %r{ono}i, private: true, &lam
|
23
|
-
assert @route.match('onOmatopeja', true) == [%r{ono}i, [lam, @route]
|
23
|
+
assert @route.match('onOmatopeja', true) == [%r{ono}i, [lam, @route]]
|
24
24
|
refute @route.match('onOmatopeja', false)
|
25
25
|
@route.on 'asdf', &lam
|
26
26
|
assert @route.match('asdf')
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class SampleClass
|
4
|
+
extend Balotelli::Core::Utils::ClassVariableGetter
|
5
|
+
class_variable_get :one, :string
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class ClassVariableGetterTest < Minitest::Test
|
12
|
+
def setup
|
13
|
+
@instance = SampleClass.new
|
14
|
+
SampleClass.instance_variable_set(:@one, 1)
|
15
|
+
SampleClass.instance_variable_set(:@string, 'string')
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_it_defines_methods
|
19
|
+
assert @instance.one == 1
|
20
|
+
assert @instance.string == 'string'
|
21
|
+
end
|
22
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: balotelli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.1
|
4
|
+
version: 0.4.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marcin Henryk Bartkowiak
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -86,6 +86,7 @@ files:
|
|
86
86
|
- test/lib/balotelli/config_test.rb
|
87
87
|
- test/lib/balotelli/core/irc_test.rb
|
88
88
|
- test/lib/balotelli/core/router_test.rb
|
89
|
+
- test/lib/balotelli/core/utils_test.rb
|
89
90
|
- test/lib/balotelli/special_one.rb
|
90
91
|
- test/lib/balotelli/xyz.rb
|
91
92
|
- test/test_helper.rb
|
@@ -120,6 +121,7 @@ test_files:
|
|
120
121
|
- test/lib/balotelli/config_test.rb
|
121
122
|
- test/lib/balotelli/core/irc_test.rb
|
122
123
|
- test/lib/balotelli/core/router_test.rb
|
124
|
+
- test/lib/balotelli/core/utils_test.rb
|
123
125
|
- test/lib/balotelli/special_one.rb
|
124
126
|
- test/lib/balotelli/xyz.rb
|
125
127
|
- test/test_helper.rb
|