beerbot 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/bin/run-irc.rb +24 -0
- data/lib/BeerBot.rb +20 -0
- data/lib/BeerBot/00.utils/DataFile.rb +56 -0
- data/lib/BeerBot/00.utils/InOut.rb +46 -0
- data/lib/BeerBot/00.utils/More.rb +68 -0
- data/lib/BeerBot/00.utils/paramExpand.rb +77 -0
- data/lib/BeerBot/00.utils/utils.rb +149 -0
- data/lib/BeerBot/00.utils/world/IRCWorld.rb +47 -0
- data/lib/BeerBot/00.utils/world/World.rb +84 -0
- data/lib/BeerBot/01.connect/Connection.rb +23 -0
- data/lib/BeerBot/01.connect/IRCConnection.rb +133 -0
- data/lib/BeerBot/01.protocols/botmsg.rb +59 -0
- data/lib/BeerBot/01.protocols/irc.rb +250 -0
- data/lib/BeerBot/02.bot/bot.rb +234 -0
- data/lib/BeerBot/03.more/BotMsgMore.rb +34 -0
- data/lib/BeerBot/06.dispatchers/irc.rb +160 -0
- data/lib/BeerBot/70.scheduler/scheduler.rb +22 -0
- data/lib/BeerBot/Config.rb +62 -0
- data/lib/RunIRC.rb +153 -0
- metadata +134 -0
@@ -0,0 +1,62 @@
|
|
1
|
+
# The files in this directory are part of BeerBot, a a ruby irc bot library.
|
2
|
+
# Copyright (C) 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
|
+
|
10
|
+
# Config should be loaded with the json from a config file before
|
11
|
+
# initialisation of the system.
|
12
|
+
#
|
13
|
+
# It should be available to things like bot modules eg
|
14
|
+
# BeerBot::Config['datadir']
|
15
|
+
#
|
16
|
+
|
17
|
+
Config = {}
|
18
|
+
|
19
|
+
class << Config
|
20
|
+
|
21
|
+
def load config
|
22
|
+
self.reject!{true}
|
23
|
+
self.merge!(config)
|
24
|
+
end
|
25
|
+
|
26
|
+
def validate!
|
27
|
+
if not self['datadir'] then
|
28
|
+
raise "'datadir' not set in config."
|
29
|
+
end
|
30
|
+
if not self['moduledir'] then
|
31
|
+
raise "'moduledir' not set in config."
|
32
|
+
end
|
33
|
+
unless File.exists?(self['datadir']) then
|
34
|
+
raise "datadir:'#{self['datadir']}' doesn't exist."
|
35
|
+
end
|
36
|
+
unless File.exists?(self['moduledir']) then
|
37
|
+
raise "config['moduledir']=#{@module_path} doesn't exist, make one (bot modules will go here)!"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Return path for module data dir -- a place where the module can
|
42
|
+
# stash data.
|
43
|
+
|
44
|
+
def module_data name,&block
|
45
|
+
self.validate!
|
46
|
+
datadir = self['datadir']
|
47
|
+
path = File.join(datadir,'modules',name)
|
48
|
+
if not File.exists?(path) then
|
49
|
+
FileUtils.mkdir_p(path)
|
50
|
+
end
|
51
|
+
if block_given? then
|
52
|
+
Dir.chdir(path) {
|
53
|
+
block.call(path)
|
54
|
+
}
|
55
|
+
else
|
56
|
+
path
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
data/lib/RunIRC.rb
ADDED
@@ -0,0 +1,153 @@
|
|
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
|
+
require 'set'
|
9
|
+
require 'rubygems'
|
10
|
+
require 'pry'
|
11
|
+
require 'json'
|
12
|
+
require_relative 'BeerBot'
|
13
|
+
|
14
|
+
# Run the irc bot.
|
15
|
+
#
|
16
|
+
# This class creates and coordinates all the high level components
|
17
|
+
# needed to run beerbot over irc.
|
18
|
+
#
|
19
|
+
# See bin/* .
|
20
|
+
|
21
|
+
module BeerBot; end
|
22
|
+
|
23
|
+
class BeerBot::RunIRC
|
24
|
+
|
25
|
+
Utils = BeerBot::Utils
|
26
|
+
IRCWorld = BeerBot::Utils::IRCWorld
|
27
|
+
InOut = BeerBot::Utils::InOut
|
28
|
+
IRCConnection = BeerBot::IRCConnection
|
29
|
+
IRC = BeerBot::Protocol::IRC
|
30
|
+
Bot = BeerBot::Bot
|
31
|
+
IRCDispatcher = BeerBot::Dispatchers::IRCDispatcher
|
32
|
+
Scheduler = BeerBot::Scheduler
|
33
|
+
|
34
|
+
attr_accessor :config,:bot,:scheduler,:dispatcher,:world,:conn,:postq,:parse,:more
|
35
|
+
|
36
|
+
# Initialize all parts of the system here.
|
37
|
+
#
|
38
|
+
# config should be a hash, normally BeerBot::Config.
|
39
|
+
#
|
40
|
+
# Note BeerBot::Config should be loaded before we initialize here.
|
41
|
+
|
42
|
+
def initialize config
|
43
|
+
|
44
|
+
@path = File.expand_path(File.dirname(__FILE__)+'/..')
|
45
|
+
@module_path = config['moduledir']
|
46
|
+
@config = config
|
47
|
+
|
48
|
+
# Create the bot.
|
49
|
+
@bot = Bot.new(@module_path,config['modules'])
|
50
|
+
|
51
|
+
# Dispatcher which receives messages and interacts with the bot.
|
52
|
+
@dispatcher = IRCDispatcher.new(
|
53
|
+
@bot,
|
54
|
+
config['nick'],
|
55
|
+
prefix:config['cmd_prefix'],
|
56
|
+
world:@world
|
57
|
+
)
|
58
|
+
|
59
|
+
# Set up scheduler (this doesn't start it yet)...
|
60
|
+
@scheduler = Scheduler.instance(config['timezone'])
|
61
|
+
# Create a world associated with this irc connection.
|
62
|
+
# (lists channels and users we know about)
|
63
|
+
@world = IRCWorld.new(config['nick'])
|
64
|
+
|
65
|
+
# Create but don't open the irc connection.
|
66
|
+
@conn = IRCConnection.new(
|
67
|
+
nick:config['nick'],
|
68
|
+
server:config['server'])
|
69
|
+
|
70
|
+
# Dispatcher thread takes stuff from @conn queue and processes
|
71
|
+
# it...
|
72
|
+
|
73
|
+
@dispatcher_thread = InOut.new(inq:@conn.queue,outq:@conn.writeq) {|input|
|
74
|
+
str,raw = input
|
75
|
+
replies = @dispatcher.receive(str)
|
76
|
+
}
|
77
|
+
@dispatcher_thread.start!
|
78
|
+
|
79
|
+
# Schedule dispatcher thread.
|
80
|
+
#
|
81
|
+
# These are responses that were prepared and scheduled earlier and
|
82
|
+
# which also need to be dispatched.
|
83
|
+
|
84
|
+
@scheduler_thread = InOut.new(inq:@scheduler.queue,outq:@conn.writeq) {|cron_job|
|
85
|
+
puts "<< scheduler #{cron_job.inspect}"
|
86
|
+
puts "<< scheduler #{@scheduler.time}"
|
87
|
+
IRC.to_irc(cron_job.job)
|
88
|
+
}
|
89
|
+
@scheduler_thread.start!
|
90
|
+
|
91
|
+
# Set up a repl in a separate thread.
|
92
|
+
#
|
93
|
+
# In pry, you can then do:
|
94
|
+
# @conn.writeq.enq IRC.join('#chan1')
|
95
|
+
# @conn.write IRC.join('#chan1')
|
96
|
+
|
97
|
+
Pry.config.prompt = Proc.new {|_| "pry> "}
|
98
|
+
@pry_thread = Thread.new {
|
99
|
+
binding.pry
|
100
|
+
}
|
101
|
+
|
102
|
+
# Do stuff once we've identified with the irc server...
|
103
|
+
#
|
104
|
+
# Join channels.
|
105
|
+
# Start the scheduler.
|
106
|
+
|
107
|
+
@conn.ready? {
|
108
|
+
channels = config['channels']
|
109
|
+
if channels then
|
110
|
+
channels.each{|chan|
|
111
|
+
self.join(chan)
|
112
|
+
}
|
113
|
+
end
|
114
|
+
@scheduler.start
|
115
|
+
}
|
116
|
+
end
|
117
|
+
|
118
|
+
# Start the connection.
|
119
|
+
|
120
|
+
def start
|
121
|
+
@conn.open.join
|
122
|
+
end
|
123
|
+
|
124
|
+
# Convenience method to say something to channel or someone.
|
125
|
+
|
126
|
+
def say to,msg
|
127
|
+
@conn.writeq.enq(IRC.msg(to,msg))
|
128
|
+
end
|
129
|
+
|
130
|
+
# Convenience method to do something (/me).
|
131
|
+
|
132
|
+
def action to,msg
|
133
|
+
@conn.writeq.enq(IRC.action(to,msg))
|
134
|
+
end
|
135
|
+
|
136
|
+
# Convenience method to join a channel.
|
137
|
+
|
138
|
+
def join chan
|
139
|
+
@conn.writeq.enq(IRC.join(chan))
|
140
|
+
end
|
141
|
+
|
142
|
+
# Reload @bot using module list 'modules'.
|
143
|
+
#
|
144
|
+
# You could use
|
145
|
+
|
146
|
+
def reload! modules=[]
|
147
|
+
@config['modules'] = modules
|
148
|
+
@bot = Bot.new(@module_path,modules)
|
149
|
+
@dispatcher.bot = @bot
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
|
metadata
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: beerbot
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Daniel Bush
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-04-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: pry
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: sqlite3
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: CronR
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.1.3
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.1.3
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: byebug
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: '["Out of the box you get an irc bot, but beerbot could be so much more...",
|
84
|
+
["Daniel Bush"]]'
|
85
|
+
email: dlb.id.au@gmail.com
|
86
|
+
executables:
|
87
|
+
- run-irc.rb
|
88
|
+
extensions: []
|
89
|
+
extra_rdoc_files: []
|
90
|
+
files:
|
91
|
+
- lib/BeerBot/00.utils/DataFile.rb
|
92
|
+
- lib/BeerBot/00.utils/InOut.rb
|
93
|
+
- lib/BeerBot/00.utils/More.rb
|
94
|
+
- lib/BeerBot/00.utils/paramExpand.rb
|
95
|
+
- lib/BeerBot/00.utils/utils.rb
|
96
|
+
- lib/BeerBot/00.utils/world/IRCWorld.rb
|
97
|
+
- lib/BeerBot/00.utils/world/World.rb
|
98
|
+
- lib/BeerBot/01.connect/Connection.rb
|
99
|
+
- lib/BeerBot/01.connect/IRCConnection.rb
|
100
|
+
- lib/BeerBot/01.protocols/botmsg.rb
|
101
|
+
- lib/BeerBot/01.protocols/irc.rb
|
102
|
+
- lib/BeerBot/02.bot/bot.rb
|
103
|
+
- lib/BeerBot/03.more/BotMsgMore.rb
|
104
|
+
- lib/BeerBot/06.dispatchers/irc.rb
|
105
|
+
- lib/BeerBot/70.scheduler/scheduler.rb
|
106
|
+
- lib/BeerBot/Config.rb
|
107
|
+
- lib/BeerBot.rb
|
108
|
+
- lib/RunIRC.rb
|
109
|
+
- bin/run-irc.rb
|
110
|
+
homepage: http://github.com/danielbush/BeerBot
|
111
|
+
licenses:
|
112
|
+
- GPL
|
113
|
+
metadata: {}
|
114
|
+
post_install_message:
|
115
|
+
rdoc_options: []
|
116
|
+
require_paths:
|
117
|
+
- lib
|
118
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - '>='
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '0'
|
123
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - '>='
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '0'
|
128
|
+
requirements: []
|
129
|
+
rubyforge_project:
|
130
|
+
rubygems_version: 2.1.10
|
131
|
+
signing_key:
|
132
|
+
specification_version: 4
|
133
|
+
summary: An ruby 2.0 bot
|
134
|
+
test_files: []
|