protonbot 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/.rubocop.yml +38 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/CONFIG.md +45 -0
- data/CORE_PLUGIN.md +128 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +21 -0
- data/PLUGIN.md +45 -0
- data/README.md +81 -0
- data/Rakefile +2 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/exe/protonbot-gencert +7 -0
- data/lib/protonbot/bot.rb +64 -0
- data/lib/protonbot/bot_conf.rb +48 -0
- data/lib/protonbot/bot_plugins.rb +110 -0
- data/lib/protonbot/core_plugin/apis/help.rb +54 -0
- data/lib/protonbot/core_plugin/apis/index.rb +2 -0
- data/lib/protonbot/core_plugin/apis/perms.rb +118 -0
- data/lib/protonbot/core_plugin/codes/index.rb +3 -0
- data/lib/protonbot/core_plugin/codes/names.rb +21 -0
- data/lib/protonbot/core_plugin/codes/welcome.rb +7 -0
- data/lib/protonbot/core_plugin/codes/whois.rb +9 -0
- data/lib/protonbot/core_plugin/commands/admin.rb +107 -0
- data/lib/protonbot/core_plugin/commands/basic.rb +9 -0
- data/lib/protonbot/core_plugin/commands/cross.rb +40 -0
- data/lib/protonbot/core_plugin/commands/help.rb +25 -0
- data/lib/protonbot/core_plugin/commands/index.rb +6 -0
- data/lib/protonbot/core_plugin/commands/joinpart.rb +25 -0
- data/lib/protonbot/core_plugin/commands/perms.rb +50 -0
- data/lib/protonbot/core_plugin/hooks/ctcp.rb +9 -0
- data/lib/protonbot/core_plugin/hooks/index.rb +7 -0
- data/lib/protonbot/core_plugin/hooks/joinpart.rb +42 -0
- data/lib/protonbot/core_plugin/hooks/kick.rb +17 -0
- data/lib/protonbot/core_plugin/hooks/nick.rb +10 -0
- data/lib/protonbot/core_plugin/hooks/ping.rb +3 -0
- data/lib/protonbot/core_plugin/hooks/privmsg.rb +62 -0
- data/lib/protonbot/core_plugin/hooks/raw.rb +32 -0
- data/lib/protonbot/core_plugin/plugin.rb +10 -0
- data/lib/protonbot/event_lock.rb +25 -0
- data/lib/protonbot/hook.rb +22 -0
- data/lib/protonbot/log.rb +182 -0
- data/lib/protonbot/log_wrapper.rb +52 -0
- data/lib/protonbot/numeric.rb +140 -0
- data/lib/protonbot/plug.rb +118 -0
- data/lib/protonbot/plug_events.rb +51 -0
- data/lib/protonbot/plug_io.rb +99 -0
- data/lib/protonbot/plug_utils.rb +242 -0
- data/lib/protonbot/plugin.rb +101 -0
- data/lib/protonbot/version.rb +4 -0
- data/lib/protonbot.rb +38 -0
- data/protonbot.gemspec +31 -0
- metadata +181 -0
@@ -0,0 +1,51 @@
|
|
1
|
+
class ProtonBot::Plug
|
2
|
+
# Emits passed event - calls first matching hook from each plugin
|
3
|
+
# @param dat [Hash] Event hash
|
4
|
+
# @return [Plug] self
|
5
|
+
def emit(dat = {})
|
6
|
+
bot.plugins.each do |_, p|
|
7
|
+
worked = []
|
8
|
+
p.hooks.each do |h|
|
9
|
+
next unless dat >= h.pattern && !worked.include?(h.object_id) && worked.empty?
|
10
|
+
canrun = true
|
11
|
+
h.chain.each do |l|
|
12
|
+
next unless canrun
|
13
|
+
canrun = l.call(dat, h)
|
14
|
+
end
|
15
|
+
worked << h.object_id
|
16
|
+
h.block.call(dat) if canrun
|
17
|
+
end
|
18
|
+
worked = []
|
19
|
+
end
|
20
|
+
event_locks.each_with_index do |el, k|
|
21
|
+
if dat >= el.pattern
|
22
|
+
event_locks.delete_at(k)
|
23
|
+
el.unlock
|
24
|
+
end
|
25
|
+
end
|
26
|
+
self
|
27
|
+
end
|
28
|
+
|
29
|
+
# Emits passed event in new thread
|
30
|
+
# @param dat [Hash] Event hash
|
31
|
+
# @return [Plug] self
|
32
|
+
def emitt(dat = {})
|
33
|
+
d = dat.clone
|
34
|
+
Thread.new do
|
35
|
+
begin
|
36
|
+
emit(d)
|
37
|
+
rescue => e
|
38
|
+
log_err(e)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
self
|
42
|
+
end
|
43
|
+
|
44
|
+
# Creates EventLock with given pattern.
|
45
|
+
# @param pattern [Hash]
|
46
|
+
# @return [Plug] self
|
47
|
+
def wait_for(pattern)
|
48
|
+
ProtonBot::EventLock.new(self, pattern)
|
49
|
+
self
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
class ProtonBot::Plug
|
2
|
+
# Main read-loop. Reads data from socket and emits event `raw`
|
3
|
+
def readloop
|
4
|
+
while @running
|
5
|
+
if s = @sock.gets
|
6
|
+
s = s.force_encoding(@conf['encoding'])
|
7
|
+
s = s[0..-3]
|
8
|
+
log.info "R > #{s}"
|
9
|
+
begin
|
10
|
+
emit(type: :raw, raw_data: s.clone, plug: self, db: db, bot: bot, core: bot.plugins['core'])
|
11
|
+
rescue => e
|
12
|
+
log_err(e)
|
13
|
+
end
|
14
|
+
else
|
15
|
+
@running = false
|
16
|
+
end
|
17
|
+
end
|
18
|
+
log.info 'Connection closed.'
|
19
|
+
end
|
20
|
+
|
21
|
+
# Main write-loop. Reads data from queue and sends it to server
|
22
|
+
def writeloop
|
23
|
+
while @running || !@wqueue.empty?
|
24
|
+
s = @queue.pop
|
25
|
+
write_(s)
|
26
|
+
sleep(@conf['queue_delay'])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Adds given message to the queue
|
31
|
+
# @param s [String] Message
|
32
|
+
# @return [Plug] self
|
33
|
+
def write(s)
|
34
|
+
@queue << s
|
35
|
+
self
|
36
|
+
end
|
37
|
+
|
38
|
+
# Sends message to server without using queue.
|
39
|
+
# @param s [String] Message
|
40
|
+
# @return [Plug] self
|
41
|
+
def write_(s)
|
42
|
+
s = s.encode(@conf['encoding'], s.encoding)
|
43
|
+
@sock.puts s
|
44
|
+
log.info "W > #{s}"
|
45
|
+
end
|
46
|
+
|
47
|
+
# Sends credentials to server (PASS, NICK, USER).
|
48
|
+
def introduce
|
49
|
+
write_("PASS #{@conf['pass']}") if @conf['pass']
|
50
|
+
write_("NICK #{@conf['nick']}")
|
51
|
+
write_("USER #{@conf['user']} 0 * :#{@conf['rnam']}")
|
52
|
+
end
|
53
|
+
|
54
|
+
# Splits given string each 399 bytes and on newlines
|
55
|
+
# @param string [String]
|
56
|
+
# @return [String] Output
|
57
|
+
def self.ssplit(string)
|
58
|
+
out = []
|
59
|
+
arr = string.split("\n\r")
|
60
|
+
arr.each do |i|
|
61
|
+
items = i.scan(/.{,399}/)
|
62
|
+
items.delete('')
|
63
|
+
items.each do |i2|
|
64
|
+
out << i2
|
65
|
+
end
|
66
|
+
end
|
67
|
+
out
|
68
|
+
end
|
69
|
+
|
70
|
+
# Colorizes given string.
|
71
|
+
# @param string [String]
|
72
|
+
# @return [String] Output
|
73
|
+
def self.process_colors(string)
|
74
|
+
string
|
75
|
+
.gsub("%C%", "%C?")
|
76
|
+
.gsub(",%", ",?")
|
77
|
+
.gsub("%C", "\x03")
|
78
|
+
.gsub("%B", "\x02")
|
79
|
+
.gsub("%I", "\x10")
|
80
|
+
.gsub("%U", "\x1F")
|
81
|
+
.gsub("%N", "\x0F")
|
82
|
+
.gsub("?WHITE", "0")
|
83
|
+
.gsub("?BLACK", "1")
|
84
|
+
.gsub("?BLUE", "2")
|
85
|
+
.gsub("?GREEN", "3")
|
86
|
+
.gsub("?RED", "4")
|
87
|
+
.gsub("?BROWN", "5")
|
88
|
+
.gsub("?PURPLE", "6")
|
89
|
+
.gsub("?ORANGE", "7")
|
90
|
+
.gsub("?YELLOW", "8")
|
91
|
+
.gsub("?LGREEN", "9")
|
92
|
+
.gsub("?CYAN" , "10")
|
93
|
+
.gsub("?LCYAN", "11")
|
94
|
+
.gsub("?LBLUE", "12")
|
95
|
+
.gsub("?PINK", "13")
|
96
|
+
.gsub("?GREY", "14")
|
97
|
+
.gsub("?LGREY", "15")
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,242 @@
|
|
1
|
+
class ProtonBot::Plug
|
2
|
+
# Sends WHOIS message to the server
|
3
|
+
# @param nick [String]
|
4
|
+
# @return [Plug] self
|
5
|
+
def whois(nick)
|
6
|
+
write("WHOIS #{nick}")
|
7
|
+
self
|
8
|
+
end
|
9
|
+
|
10
|
+
# Gets hostname for given nickname using WHOIS and event lock
|
11
|
+
# @param nick [String]
|
12
|
+
# @return [String] host
|
13
|
+
def gethost(nick)
|
14
|
+
if @users[nick] and @users[nick][:host]
|
15
|
+
@users[nick][:host]
|
16
|
+
else
|
17
|
+
Thread.new do
|
18
|
+
sleep(1)
|
19
|
+
whois(nick)
|
20
|
+
end
|
21
|
+
wait_for(type: :code_whoisuser, nick: nick)
|
22
|
+
end
|
23
|
+
@users[nick][:host]
|
24
|
+
end
|
25
|
+
|
26
|
+
# Gets username for given nickname using WHOIS and event lock
|
27
|
+
# @param nick [String]
|
28
|
+
# @return [String] user
|
29
|
+
def getuser(nick)
|
30
|
+
if @users[nick] and @users[nick][:user]
|
31
|
+
@users[nick][:user]
|
32
|
+
else
|
33
|
+
Thread.new do
|
34
|
+
sleep(1)
|
35
|
+
whois(nick)
|
36
|
+
end
|
37
|
+
wait_for(type: :code, code: ProtonBot::Numeric::WHOISUSER)
|
38
|
+
@users[nick][:user]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Changes current nick to given. If successful, `unick` event will be emitted
|
43
|
+
# @param to [String]
|
44
|
+
# @return [Plug] self
|
45
|
+
def change_nick(to)
|
46
|
+
write("NICK #{to}")
|
47
|
+
self
|
48
|
+
end
|
49
|
+
|
50
|
+
# Joins given channel and uses password if it's provided
|
51
|
+
# @param chan [String]
|
52
|
+
# @param pass [String] Password
|
53
|
+
# @return [Plug] self
|
54
|
+
def join(chan, pass = '')
|
55
|
+
write("JOIN #{chan} #{pass}")
|
56
|
+
self
|
57
|
+
end
|
58
|
+
|
59
|
+
# Parts given channel with given reason
|
60
|
+
# @param chan [String]
|
61
|
+
# @param reason [String]
|
62
|
+
def part(chan, reason = 'Parting...')
|
63
|
+
write("PART #{chan} :#{reason}")
|
64
|
+
self
|
65
|
+
end
|
66
|
+
|
67
|
+
# Sends message to given target. Splits it each 399 bytes.
|
68
|
+
# @param target [String]
|
69
|
+
# @param msg [String]
|
70
|
+
# @return [Plug] self
|
71
|
+
def privmsg(target, msg)
|
72
|
+
self.class.ssplit(self.class.process_colors(msg)).each do |m|
|
73
|
+
write("PRIVMSG #{target} :\u200B#{m}")
|
74
|
+
end
|
75
|
+
self
|
76
|
+
end
|
77
|
+
|
78
|
+
# Sends notice to given target. Splits it each 399 bytes.
|
79
|
+
# @param target [String]
|
80
|
+
# @param msg [String]
|
81
|
+
# @return [Plug] self
|
82
|
+
def notice(target, msg)
|
83
|
+
self.class.ssplit(self.class.process_colors(msg)).each do |m|
|
84
|
+
write("NOTICE #{target} :\u200B#{m}")
|
85
|
+
end
|
86
|
+
self
|
87
|
+
end
|
88
|
+
|
89
|
+
# Sends CTCP to given target.
|
90
|
+
# @param target [String]
|
91
|
+
# @param msg [String]
|
92
|
+
# @return [Plug] self
|
93
|
+
def ctcp(target, msg)
|
94
|
+
write("PRIVMSG #{target} :\x01#{msg}\x01")
|
95
|
+
self
|
96
|
+
end
|
97
|
+
|
98
|
+
# Sends NCTCP to given target.
|
99
|
+
# @param target [String]
|
100
|
+
# @param msg [String]
|
101
|
+
# @return [Plug] self
|
102
|
+
def nctcp(target, msg)
|
103
|
+
write("NOTICE #{target} :\x01#{msg}\x01")
|
104
|
+
self
|
105
|
+
end
|
106
|
+
|
107
|
+
# Invites user to given channel
|
108
|
+
# @param chan [String]
|
109
|
+
# @param nick [String]
|
110
|
+
# @return [Plug] self
|
111
|
+
def invite(chan, nick)
|
112
|
+
write("INVITE #{nick} #{chan}")
|
113
|
+
self
|
114
|
+
end
|
115
|
+
|
116
|
+
# Sets mode on given user at given channel
|
117
|
+
# @param chan [String]
|
118
|
+
# @param nick [String]
|
119
|
+
# @param mode [String]
|
120
|
+
# @return [Plug] self
|
121
|
+
def usermode(chan, nick, mode)
|
122
|
+
write("MODE #{chan} #{mode} #{nick}")
|
123
|
+
self
|
124
|
+
end
|
125
|
+
|
126
|
+
# Sets mode on given channel
|
127
|
+
# @param chan [String]
|
128
|
+
# @param mode [String]
|
129
|
+
# @return [Plug] self
|
130
|
+
def chanmode(chan, mode)
|
131
|
+
write("MODE #{chan} #{mode}")
|
132
|
+
self
|
133
|
+
end
|
134
|
+
|
135
|
+
# Sets quiet on given user at given channel
|
136
|
+
# @param chan [String]
|
137
|
+
# @param nick [String]
|
138
|
+
# @return [Plug] self
|
139
|
+
def quiet(chan, nick)
|
140
|
+
usermode(chan, nick, '+q')
|
141
|
+
self
|
142
|
+
end
|
143
|
+
|
144
|
+
# Removes quiet on given user at given channel
|
145
|
+
# @param chan [String]
|
146
|
+
# @param nick [String]
|
147
|
+
# @return [Plug] self
|
148
|
+
def unquiet(chan, nick)
|
149
|
+
usermode(chan, nick, '-q')
|
150
|
+
self
|
151
|
+
end
|
152
|
+
|
153
|
+
# Sets ban on given user at given channel
|
154
|
+
# @param chan [String]
|
155
|
+
# @param nick [String]
|
156
|
+
# @return [Plug] self
|
157
|
+
def ban(chan, nick)
|
158
|
+
usermode(chan, nick, '+b')
|
159
|
+
self
|
160
|
+
end
|
161
|
+
|
162
|
+
# Removes ban on given user at given channel
|
163
|
+
# @param chan [String]
|
164
|
+
# @param nick [String]
|
165
|
+
# @return [Plug] self
|
166
|
+
def unban(chan, nick)
|
167
|
+
usermode(chan, nick, '-b')
|
168
|
+
self
|
169
|
+
end
|
170
|
+
|
171
|
+
# Sets excempt on given user at given channel
|
172
|
+
# @param chan [String]
|
173
|
+
# @param nick [String]
|
174
|
+
# @return [Plug] self
|
175
|
+
def excempt(chan, nick)
|
176
|
+
usermode(chan, nick, '+e')
|
177
|
+
self
|
178
|
+
end
|
179
|
+
|
180
|
+
# Removes excempt on given user at given channel
|
181
|
+
# @param chan [String]
|
182
|
+
# @param nick [String]
|
183
|
+
# @return [Plug] self
|
184
|
+
def unexcempt(chan, nick)
|
185
|
+
usermode(chan, nick, '-e')
|
186
|
+
self
|
187
|
+
end
|
188
|
+
|
189
|
+
# Ops given user at given channel
|
190
|
+
# @param chan [String]
|
191
|
+
# @param nick [String]
|
192
|
+
# @return [Plug] self
|
193
|
+
def op(chan, nick)
|
194
|
+
usermode(chan, nick, '+o')
|
195
|
+
self
|
196
|
+
end
|
197
|
+
|
198
|
+
# Deops given user at given channel
|
199
|
+
# @param chan [String]
|
200
|
+
# @param nick [String]
|
201
|
+
# @return [Plug] self
|
202
|
+
def deop(chan, nick)
|
203
|
+
usermode(chan, nick, '-o')
|
204
|
+
self
|
205
|
+
end
|
206
|
+
|
207
|
+
# Voices given user at given channel
|
208
|
+
# @param chan [String]
|
209
|
+
# @param nick [String]
|
210
|
+
# @return [Plug] self
|
211
|
+
def voice(chan, nick)
|
212
|
+
usermode(chan, nick, '+v')
|
213
|
+
self
|
214
|
+
end
|
215
|
+
|
216
|
+
# Devoices on given user at given channel
|
217
|
+
# @param chan [String]
|
218
|
+
# @param nick [String]
|
219
|
+
# @return [Plug] self
|
220
|
+
def devoice(chan, nick)
|
221
|
+
usermode(chan, nick, '-v')
|
222
|
+
self
|
223
|
+
end
|
224
|
+
|
225
|
+
# Kicks given user from given channel
|
226
|
+
# @param chan [String]
|
227
|
+
# @param nick [String]
|
228
|
+
# @return [Plug] self
|
229
|
+
def kick(chan, nick, reason = 'Default Kick Reason')
|
230
|
+
write("KICK #{chan} #{nick} :#{reason}")
|
231
|
+
self
|
232
|
+
end
|
233
|
+
|
234
|
+
# Removes given user from given channel
|
235
|
+
# @param chan [String]
|
236
|
+
# @param nick [String]
|
237
|
+
# @return [Plug] self
|
238
|
+
def remove(chan, nick, reason = 'Default Remove Reason')
|
239
|
+
write("REMOVE #{chan} #{nick} :#{reason}")
|
240
|
+
self
|
241
|
+
end
|
242
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# Plugin object. Use it to alter bot's behavior
|
2
|
+
# @see http://www.rubydoc.info/gems/protonbot/file/plugin-demo.md
|
3
|
+
# @!attribute [r] name
|
4
|
+
# @return [String] Plugin's name
|
5
|
+
# @!attribute [r] version
|
6
|
+
# @return [String] Plugin's version
|
7
|
+
# @!attribute [r] description
|
8
|
+
# @return [String] Plugin's description
|
9
|
+
# @!attribute [r] name
|
10
|
+
# @return [String] Plugin's name
|
11
|
+
# @!attribute [r] hooks
|
12
|
+
# @return [Array<Hook>] Plugin's hooks
|
13
|
+
# @!attribute [rw] bot
|
14
|
+
# @return [Bot] Bot
|
15
|
+
# @!attribute [rw] Log
|
16
|
+
# @return [LogWrapper] Log
|
17
|
+
# @!attribute [rw] path
|
18
|
+
# @return [String] Path
|
19
|
+
# @!attribute [r] core
|
20
|
+
# @return [Plugin] Core plugin
|
21
|
+
class ProtonBot::Plugin
|
22
|
+
attr_reader :name, :version, :description, :plugins, :hooks, :core
|
23
|
+
attr_accessor :bot, :log, :path
|
24
|
+
|
25
|
+
# @param block [Proc]
|
26
|
+
def initialize(&block)
|
27
|
+
@hooks = []
|
28
|
+
@block = block
|
29
|
+
@numeric = ProtonBot::Numeric
|
30
|
+
end
|
31
|
+
|
32
|
+
# Starts plugin
|
33
|
+
# @return [Plugin] self
|
34
|
+
def launch
|
35
|
+
@plugins = @bot.plugins
|
36
|
+
@core = @bot.plugins['core']
|
37
|
+
instance_exec(&@block)
|
38
|
+
raise ProtonBot::PluginError, 'Plugin-name is not set!' unless
|
39
|
+
@name
|
40
|
+
raise ProtonBot::PluginError, 'Plugin-description is not set!' unless
|
41
|
+
@description
|
42
|
+
raise ProtonBot::PluginError, 'Plugin-description is not set!' unless
|
43
|
+
@description
|
44
|
+
log.info("Started plugin `#{@name} v#{@version}` successfully!")
|
45
|
+
end
|
46
|
+
|
47
|
+
# Creates hook and returns it
|
48
|
+
# @param pattern [Hash<Symbol>]
|
49
|
+
# @param block [Proc]
|
50
|
+
# @return [Hook] hook
|
51
|
+
def hook(pattern = {}, &block)
|
52
|
+
h = ProtonBot::Hook.new(pattern, &block)
|
53
|
+
@hooks << h
|
54
|
+
h
|
55
|
+
end
|
56
|
+
|
57
|
+
# Shortcut for `hook(type: :command, ...) {}`
|
58
|
+
# @param pattern [Hash<Symbol>]
|
59
|
+
# @param block [Proc]
|
60
|
+
# @return [Hook] hook
|
61
|
+
def cmd(pattern = {}, &block)
|
62
|
+
hook(pattern.merge(type: :command), &block)
|
63
|
+
end
|
64
|
+
|
65
|
+
# Emits passed event
|
66
|
+
# @param dat [Hash<Symbol>]
|
67
|
+
def emit(dat = {})
|
68
|
+
dat[:plug].emit(dat) if dat[:plug]
|
69
|
+
end
|
70
|
+
|
71
|
+
# Emits passed event in other thread
|
72
|
+
# @param dat [Hash<Symbol>]
|
73
|
+
def emitt(dat = {})
|
74
|
+
dat[:plug].emitt(dat) if dat[:plug]
|
75
|
+
end
|
76
|
+
|
77
|
+
# Runs given file (.rb is appended automatically)
|
78
|
+
# @param fname [String]
|
79
|
+
def run(fname)
|
80
|
+
if @name == 'Core'
|
81
|
+
instance_eval File.read("#{Gem.loaded_specs['protonbot'].lib_dirs_glob}/" \
|
82
|
+
"protonbot/core_plugin/#{fname}.rb"), "#{name}/#{fname}.rb"
|
83
|
+
else
|
84
|
+
instance_exec do
|
85
|
+
instance_eval File.read(File.expand_path("#{path}/#{fname}.rb")), "#{name}/#{fname}.rb"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# Shortcut for `define_singleton_method(...)`
|
91
|
+
# @param name [String,Symbol]
|
92
|
+
# @param block [Proc]
|
93
|
+
def fun(name, &block)
|
94
|
+
define_singleton_method(name, &block)
|
95
|
+
end
|
96
|
+
|
97
|
+
# @return [String] Output
|
98
|
+
def inspect
|
99
|
+
%(<#ProtonBot::Plugin:#{object_id.to_s(16)} @name=#{name} @version=#{version}>)
|
100
|
+
end
|
101
|
+
end
|
data/lib/protonbot.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'English'
|
2
|
+
|
3
|
+
require 'date'
|
4
|
+
|
5
|
+
require 'pastel'
|
6
|
+
require 'tty'
|
7
|
+
require 'irb'
|
8
|
+
|
9
|
+
require 'heliodor'
|
10
|
+
|
11
|
+
require 'open3'
|
12
|
+
|
13
|
+
require 'socket'
|
14
|
+
require 'openssl'
|
15
|
+
|
16
|
+
module ProtonBot
|
17
|
+
end
|
18
|
+
|
19
|
+
require 'protonbot/version'
|
20
|
+
|
21
|
+
require 'protonbot/numeric'
|
22
|
+
|
23
|
+
require 'protonbot/log'
|
24
|
+
require 'protonbot/log_wrapper'
|
25
|
+
|
26
|
+
require 'protonbot/bot'
|
27
|
+
require 'protonbot/bot_conf'
|
28
|
+
require 'protonbot/bot_plugins'
|
29
|
+
|
30
|
+
require 'protonbot/event_lock'
|
31
|
+
|
32
|
+
require 'protonbot/plug'
|
33
|
+
require 'protonbot/plug_io'
|
34
|
+
require 'protonbot/plug_utils'
|
35
|
+
require 'protonbot/plug_events'
|
36
|
+
|
37
|
+
require 'protonbot/plugin'
|
38
|
+
require 'protonbot/hook'
|
data/protonbot.gemspec
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'protonbot/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'protonbot'
|
8
|
+
spec.version = ProtonBot::VERSION
|
9
|
+
spec.authors = ['Nickolay']
|
10
|
+
spec.email = ['nickolay02@inbox.ru']
|
11
|
+
|
12
|
+
spec.summary = 'An IRC bot library'
|
13
|
+
spec.description = 'Library for writing cross-server IRC bots'
|
14
|
+
spec.homepage = 'https://github.com/handicraftsman/ProtonBot'
|
15
|
+
spec.license = 'MIT'
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
18
|
+
f.match(%r{^(test|spec|features)/})
|
19
|
+
end
|
20
|
+
spec.bindir = 'exe'
|
21
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
|
+
spec.require_paths = ['lib']
|
23
|
+
|
24
|
+
spec.add_development_dependency 'bundler', '~> 1.13'
|
25
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
26
|
+
spec.add_development_dependency 'rubocop', '~> 0.47'
|
27
|
+
|
28
|
+
spec.add_runtime_dependency 'pastel', '~> 0.7.1'
|
29
|
+
spec.add_runtime_dependency 'tty', '~> 0.6.1'
|
30
|
+
spec.add_runtime_dependency 'heliodor', '~> 0.2.0'
|
31
|
+
end
|