beerbot 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/BeerBot/00.utils/DataFile.rb +47 -0
- data/lib/BeerBot/00.utils/world/IRCWorld.rb +5 -5
- data/lib/BeerBot/00.utils/world/World.rb +11 -21
- data/lib/BeerBot/01.connect/IRCConnection.rb +1 -2
- data/lib/BeerBot/02.protocols/irc.rb +119 -84
- data/lib/BeerBot/06.dispatchers/dispatcher.rb +7 -0
- metadata +2 -3
- data/lib/BeerBot/01.connect/Connection.rb +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 36f864e883bbc7374b90bc57465a35e14ebc9f7d
|
4
|
+
data.tar.gz: df19b2f182e991e2db92400d0dd29764a751f237
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa4f36bd206392242e866a96756e57a38a8e9178bb1928b4eaf6f45ec608b6a368cea96c19aab781f7e2b7c71c12b0a5f52502741dca3f6755df2f2941a54547
|
7
|
+
data.tar.gz: 4201d0fc06a58b7cc6cdd6dbb91ef7d680600eefb52b6f74963cd3753dbbe41b3945099d45ddd77292b1b3817da894cbc3efa04bf6c669228aef4398c816f7e6
|
@@ -6,20 +6,34 @@
|
|
6
6
|
# see <http://www.gnu.org/licenses/>.
|
7
7
|
|
8
8
|
require 'json'
|
9
|
+
|
9
10
|
module BeerBot
|
11
|
+
|
10
12
|
module Utils
|
13
|
+
|
11
14
|
# A class that loads data from a file and allows you to access it
|
12
15
|
# using the #data method.
|
13
16
|
#
|
14
17
|
# If the file is updated (after >=1 sec), #data will reload.
|
18
|
+
|
15
19
|
class DataFile
|
20
|
+
|
16
21
|
attr_reader :reloaded # true if last call to #data reloaded file
|
22
|
+
|
23
|
+
def self.create! filepath
|
24
|
+
File.open(filepath,'w'){}
|
25
|
+
self.new(filepath)
|
26
|
+
end
|
27
|
+
|
17
28
|
def initialize filepath
|
18
29
|
@filepath = filepath
|
19
30
|
@data = File.read(filepath)
|
20
31
|
@mtime = File.stat(filepath).mtime
|
21
32
|
@reloaded = false
|
22
33
|
end
|
34
|
+
|
35
|
+
# Load data from file.
|
36
|
+
|
23
37
|
def data
|
24
38
|
@reloaded = false
|
25
39
|
return @data unless File.exists?(@filepath)
|
@@ -31,14 +45,33 @@ module BeerBot
|
|
31
45
|
@reloaded = true
|
32
46
|
@data
|
33
47
|
end
|
48
|
+
|
49
|
+
def save thing
|
50
|
+
File.open(@filepath,'w') {|f|
|
51
|
+
f.write(thing)
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
34
55
|
end
|
56
|
+
|
35
57
|
# Specialised DataFile that parses json.
|
58
|
+
|
36
59
|
class JsonDataFile < DataFile
|
60
|
+
|
37
61
|
attr_reader :json
|
62
|
+
|
63
|
+
def self.create! filepath,data={}
|
64
|
+
File.open(filepath,'w') {|f| f.puts(data.to_json)}
|
65
|
+
self.new(filepath)
|
66
|
+
end
|
67
|
+
|
38
68
|
def initialize filepath
|
39
69
|
super
|
40
70
|
@json = JSON.parse(@data)
|
41
71
|
end
|
72
|
+
|
73
|
+
# Load data from file and parse as json data.
|
74
|
+
|
42
75
|
def data
|
43
76
|
super
|
44
77
|
begin
|
@@ -51,6 +84,20 @@ module BeerBot
|
|
51
84
|
end
|
52
85
|
@json
|
53
86
|
end
|
87
|
+
|
88
|
+
# Save thing back to file.
|
89
|
+
#
|
90
|
+
# Thing is assumed to be a hash or array that we call to_json on.
|
91
|
+
|
92
|
+
def save thing=nil
|
93
|
+
if thing.nil? then
|
94
|
+
thing = @json # the thing self.data returns
|
95
|
+
end
|
96
|
+
super(thing.to_json)
|
97
|
+
end
|
98
|
+
|
54
99
|
end
|
100
|
+
|
55
101
|
end
|
102
|
+
|
56
103
|
end
|
@@ -21,11 +21,6 @@ module BeerBot
|
|
21
21
|
nick.sub(/^@/,'')
|
22
22
|
end
|
23
23
|
|
24
|
-
def user nick
|
25
|
-
nick = self.remove_op(nick)
|
26
|
-
super
|
27
|
-
end
|
28
|
-
|
29
24
|
def nick oldnick,nick
|
30
25
|
oldnick = self.remove_op(oldnick)
|
31
26
|
nick = self.remove_op(nick)
|
@@ -41,6 +36,11 @@ module BeerBot
|
|
41
36
|
nick = self.remove_op(nick)
|
42
37
|
super
|
43
38
|
end
|
39
|
+
|
40
|
+
def quit nick
|
41
|
+
nick = self.remove_op(nick)
|
42
|
+
super
|
43
|
+
end
|
44
44
|
end
|
45
45
|
|
46
46
|
end
|
@@ -25,26 +25,11 @@ module BeerBot
|
|
25
25
|
|
26
26
|
end
|
27
27
|
|
28
|
-
# Fetch a user.
|
29
|
-
def user user
|
30
|
-
if self[:users].has_key?(user) then
|
31
|
-
self[:users][user]
|
32
|
-
else
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
# Fetch a channel.
|
37
|
-
def channel channel
|
38
|
-
if self[:channels].has_key?(channel) then
|
39
|
-
self[:channels][channel]
|
40
|
-
else
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
28
|
# Someone joins channel.
|
45
29
|
def join nick,channel
|
46
30
|
self[:channels][channel][:users].add(nick)
|
47
31
|
self[:users][nick][:channels].add(channel)
|
32
|
+
self[:users][nick][:quit] = false
|
48
33
|
self
|
49
34
|
end
|
50
35
|
|
@@ -58,9 +43,9 @@ module BeerBot
|
|
58
43
|
# Someone changes nick.
|
59
44
|
def nick oldnick,nick
|
60
45
|
self[:channels].each_pair{|name,chan|
|
61
|
-
if chan.member?(oldnick) then
|
62
|
-
chan.delete(oldnick)
|
63
|
-
chan.add(nick)
|
46
|
+
if chan[:users].member?(oldnick) then
|
47
|
+
chan[:users].delete(oldnick)
|
48
|
+
chan[:users].add(nick)
|
64
49
|
end
|
65
50
|
}
|
66
51
|
self[:users][nick] = self[:users][oldnick]
|
@@ -72,8 +57,13 @@ module BeerBot
|
|
72
57
|
self
|
73
58
|
end
|
74
59
|
|
75
|
-
|
76
|
-
|
60
|
+
def quit nick
|
61
|
+
self[:channels].each_pair{|name,chan|
|
62
|
+
chan[:users].delete(nick)
|
63
|
+
}
|
64
|
+
self[:users][nick][:channels] = Set.new
|
65
|
+
self[:users][nick][:quit] = true
|
66
|
+
self
|
77
67
|
end
|
78
68
|
|
79
69
|
end
|
@@ -7,7 +7,6 @@
|
|
7
7
|
|
8
8
|
require 'socket'
|
9
9
|
require 'set'
|
10
|
-
require_relative 'Connection'
|
11
10
|
|
12
11
|
module BeerBot
|
13
12
|
|
@@ -17,7 +16,7 @@ module BeerBot
|
|
17
16
|
# We also do some low-level bookkeeping, like returning pong and
|
18
17
|
# looking for welcome message.
|
19
18
|
|
20
|
-
class IRCConnection
|
19
|
+
class IRCConnection
|
21
20
|
|
22
21
|
# Queue containing received messages from the server.
|
23
22
|
attr_accessor :queue,:writeq,:readyq
|
@@ -9,8 +9,121 @@ module BeerBot
|
|
9
9
|
|
10
10
|
module Protocol
|
11
11
|
|
12
|
+
# IRC Protcol module.
|
13
|
+
#
|
14
|
+
# Main method is parse, whose job is to receive incoming irc
|
15
|
+
# strings and convert to a generalised format that higher layers
|
16
|
+
# like the dispatcher can use.
|
17
|
+
|
12
18
|
module IRC
|
13
19
|
|
20
|
+
# Parse raw irc string and then yield or return a generic
|
21
|
+
# representation of the event.
|
22
|
+
#
|
23
|
+
# Returns [event,*args]
|
24
|
+
#
|
25
|
+
# Parse's job is to take the constituents parts of an irc
|
26
|
+
# message, identify the type of event and return a generic
|
27
|
+
# representation of it.
|
28
|
+
#
|
29
|
+
# So for instance, an irc privmsg (message) is represented as
|
30
|
+
# [:msg,from,to,msg]
|
31
|
+
#
|
32
|
+
# Note that connection readiness and PONG protocol are handled by
|
33
|
+
# the irc connection, not here.
|
34
|
+
|
35
|
+
def self.parse str
|
36
|
+
|
37
|
+
m = IRCMessage.new(str)
|
38
|
+
result = []
|
39
|
+
|
40
|
+
case m[:command]
|
41
|
+
|
42
|
+
when 'NICK' # change of nick
|
43
|
+
case s=m.check(:prefix,:nick,:trailing)
|
44
|
+
when Symbol
|
45
|
+
puts "* NICK expected #{s}"
|
46
|
+
return nil
|
47
|
+
end
|
48
|
+
old = m[:prefix][:nick]
|
49
|
+
nick = m[:trailing]
|
50
|
+
result = [:nick,old,nick]
|
51
|
+
|
52
|
+
|
53
|
+
when 'QUIT' # someone leaves irc
|
54
|
+
case s=m.check(:prefix,:nick,:trailing)
|
55
|
+
when Symbol
|
56
|
+
puts "* QUIT expected #{s}"
|
57
|
+
return nil
|
58
|
+
end
|
59
|
+
nick = m[:prefix][:nick]
|
60
|
+
msg = m[:trailing]
|
61
|
+
result = [:quit,nick,msg]
|
62
|
+
|
63
|
+
when 'PART' # someone leaves channel
|
64
|
+
case s=m.check(:prefix,:nick,:params)
|
65
|
+
when Symbol
|
66
|
+
puts "* PART expected #{s}"
|
67
|
+
return nil
|
68
|
+
end
|
69
|
+
if channel=m[:params][0] then
|
70
|
+
elsif channel=m[:trailing].strip.split(/\s+/).first then
|
71
|
+
else
|
72
|
+
channel=nil
|
73
|
+
puts "* PART can't determine what is being parted from: '#{str}'"
|
74
|
+
return nil
|
75
|
+
end
|
76
|
+
nick = m[:prefix][:nick]
|
77
|
+
result = [:part,nick,channel]
|
78
|
+
|
79
|
+
when 'INVITE' # someone invites us, oo
|
80
|
+
ournick = m[:params][0]
|
81
|
+
chan = m[:trailing].strip.split(/\s+/).first
|
82
|
+
result = [:invite,chan]
|
83
|
+
|
84
|
+
when 'JOIN' # someone joins channel
|
85
|
+
case s=m.check(:prefix,:nick,:trailing)
|
86
|
+
when Symbol
|
87
|
+
puts "* JOIN expected #{s}"
|
88
|
+
return nil
|
89
|
+
end
|
90
|
+
channel = m[:trailing]
|
91
|
+
nick = m[:prefix][:nick]
|
92
|
+
result = [:join,nick,channel]
|
93
|
+
|
94
|
+
when '353' # channel user list when we join the channel
|
95
|
+
case s=m.check(:params,:trailing)
|
96
|
+
when Symbol
|
97
|
+
puts "* 353 expected #{s}"
|
98
|
+
return nil
|
99
|
+
end
|
100
|
+
channel = m[:params][2]
|
101
|
+
users = m[:trailing].split(/\s+/)
|
102
|
+
result = [:chanlist,channel,users]
|
103
|
+
#puts "[parse/353] #{result}"
|
104
|
+
|
105
|
+
when '366' # end of 353
|
106
|
+
result = [:chanlistend]
|
107
|
+
|
108
|
+
when 'PRIVMSG'
|
109
|
+
case s=m.check(:prefix,:nick,:params,:trailing)
|
110
|
+
when Symbol
|
111
|
+
#puts "* PRIVMSG expected #{s}"
|
112
|
+
return nil
|
113
|
+
end
|
114
|
+
|
115
|
+
msg = m[:trailing].strip
|
116
|
+
from = m[:prefix][:nick].strip
|
117
|
+
to = m[:params][0].strip unless m[:params].empty?
|
118
|
+
result = [:msg,from,to,msg]
|
119
|
+
|
120
|
+
else # command we don't handle
|
121
|
+
result = [:default,m]
|
122
|
+
end
|
123
|
+
|
124
|
+
result
|
125
|
+
end
|
126
|
+
|
14
127
|
# This class represents an irc message broken down into its
|
15
128
|
# major constituent parts.
|
16
129
|
#
|
@@ -113,90 +226,6 @@ module BeerBot
|
|
113
226
|
|
114
227
|
end
|
115
228
|
|
116
|
-
# Parse raw irc string and then yield or return a generic
|
117
|
-
# representation of the event.
|
118
|
-
#
|
119
|
-
# Returns [event,*args]
|
120
|
-
#
|
121
|
-
# Parse's job is to take the constituents parts of an irc
|
122
|
-
# message, identify the type of event and return a generic
|
123
|
-
# representation of it.
|
124
|
-
#
|
125
|
-
# So for instance, an irc privmsg (message) is represented as
|
126
|
-
# [:msg,from,to,msg]
|
127
|
-
#
|
128
|
-
# Note that connection readiness and PONG protocol are handled by
|
129
|
-
# the irc connection, not here.
|
130
|
-
|
131
|
-
def self.parse str
|
132
|
-
|
133
|
-
m = IRCMessage.new(str)
|
134
|
-
result = []
|
135
|
-
|
136
|
-
case m[:command]
|
137
|
-
|
138
|
-
when 'NICK' # change of nick
|
139
|
-
case s=m.check(:prefix,:nick,:trailing)
|
140
|
-
when Symbol
|
141
|
-
puts "* NICK expected #{s}"
|
142
|
-
return nil
|
143
|
-
end
|
144
|
-
old = m[:prefix][:nick]
|
145
|
-
nick = m[:trailing]
|
146
|
-
result = [:nick,old,nick]
|
147
|
-
|
148
|
-
when 'PART' # someone leaves channel
|
149
|
-
case s=m.check(:prefix,:nick,:params)
|
150
|
-
when Symbol
|
151
|
-
puts "* PART expected #{s}"
|
152
|
-
return nil
|
153
|
-
end
|
154
|
-
channel = m[:params][0]
|
155
|
-
nick = m[:prefix][:nick]
|
156
|
-
result = [:part,nick,channel]
|
157
|
-
|
158
|
-
when 'JOIN' # someone joins channel
|
159
|
-
case s=m.check(:prefix,:nick,:trailing)
|
160
|
-
when Symbol
|
161
|
-
puts "* JOIN expected #{s}"
|
162
|
-
return nil
|
163
|
-
end
|
164
|
-
channel = m[:trailing]
|
165
|
-
nick = m[:prefix][:nick]
|
166
|
-
result = [:join,nick,channel]
|
167
|
-
|
168
|
-
when '353' # channel user list when we join the channel
|
169
|
-
case s=m.check(:params,:trailing)
|
170
|
-
when Symbol
|
171
|
-
puts "* 353 expected #{s}"
|
172
|
-
return nil
|
173
|
-
end
|
174
|
-
channel = m[:params][2]
|
175
|
-
users = m[:trailing].split(/\s+/)
|
176
|
-
result = [:chanlist,channel,users]
|
177
|
-
#puts "[parse/353] #{result}"
|
178
|
-
|
179
|
-
when '366' # end of 353
|
180
|
-
result = [:chanlistend]
|
181
|
-
|
182
|
-
when 'PRIVMSG'
|
183
|
-
case s=m.check(:prefix,:nick,:params,:trailing)
|
184
|
-
when Symbol
|
185
|
-
#puts "* PRIVMSG expected #{s}"
|
186
|
-
return nil
|
187
|
-
end
|
188
|
-
|
189
|
-
msg = m[:trailing].strip
|
190
|
-
from = m[:prefix][:nick].strip
|
191
|
-
to = m[:params][0].strip unless m[:params].empty?
|
192
|
-
result = [:msg,from,to,msg]
|
193
|
-
|
194
|
-
else # command we don't handle
|
195
|
-
result = [:default,m]
|
196
|
-
end
|
197
|
-
|
198
|
-
result
|
199
|
-
end
|
200
229
|
|
201
230
|
# Return irc-conformat string from a botmsg hash.
|
202
231
|
#
|
@@ -249,6 +278,12 @@ module BeerBot
|
|
249
278
|
"JOIN #{chan}"
|
250
279
|
end
|
251
280
|
|
281
|
+
# Leave channel.
|
282
|
+
|
283
|
+
def self.leave chan
|
284
|
+
"PART #{chan}"
|
285
|
+
end
|
286
|
+
|
252
287
|
end
|
253
288
|
end
|
254
289
|
|
@@ -81,10 +81,15 @@ module BeerBot
|
|
81
81
|
replies = @bot.event(event,args:args)
|
82
82
|
when :default
|
83
83
|
replies = @bot.event(event,args:args)
|
84
|
+
|
84
85
|
when :nick
|
85
86
|
old,nick = args
|
86
87
|
@world.nick(old,nick) if @world
|
87
88
|
replies = @bot.event(event,old:old,nick:nick)
|
89
|
+
|
90
|
+
when :quit
|
91
|
+
nick,msg = args
|
92
|
+
@world.quit(nick) if @world
|
88
93
|
when :part
|
89
94
|
nick,channel = args
|
90
95
|
@world.part(nick,channel) if @world
|
@@ -102,6 +107,8 @@ module BeerBot
|
|
102
107
|
}
|
103
108
|
end
|
104
109
|
replies = @bot.event(event,channel:channel,users:users)
|
110
|
+
when :chanlistend
|
111
|
+
# ignore
|
105
112
|
|
106
113
|
when :msg
|
107
114
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: beerbot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Bush
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|
@@ -96,7 +96,6 @@ files:
|
|
96
96
|
- lib/BeerBot/00.utils/More.rb
|
97
97
|
- lib/BeerBot/00.utils/world/World.rb
|
98
98
|
- lib/BeerBot/00.utils/world/IRCWorld.rb
|
99
|
-
- lib/BeerBot/01.connect/Connection.rb
|
100
99
|
- lib/BeerBot/01.connect/IRCConnection.rb
|
101
100
|
- lib/BeerBot/01.bot/botmsg.rb
|
102
101
|
- lib/BeerBot/01.bot/BotModule.rb
|
@@ -1,23 +0,0 @@
|
|
1
|
-
# The files in this directory are part of BeerBot, a a ruby irc bot library.
|
2
|
-
# Copyright (C) 2013,2014 Daniel Bush
|
3
|
-
# This program is distributed under the terms of the GNU
|
4
|
-
# General Public License. A copy of the license should be
|
5
|
-
# enclosed with this project in the file LICENSE. If not
|
6
|
-
# see <http://www.gnu.org/licenses/>.
|
7
|
-
|
8
|
-
module BeerBot
|
9
|
-
class Connection
|
10
|
-
attr_accessor :queue
|
11
|
-
def initialize
|
12
|
-
@queue = Queue.new
|
13
|
-
end
|
14
|
-
def open
|
15
|
-
end
|
16
|
-
def close
|
17
|
-
end
|
18
|
-
def write str
|
19
|
-
end
|
20
|
-
def ready? &block
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|