mod_spox 0.1.0.1 → 0.2.0
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.
- data/CHANGELOG +36 -0
- data/INSTALL +2 -2
- data/README +0 -1
- data/bin/mod_spox +51 -12
- data/data/mod_spox/extras/AOLSpeak.rb +5 -18
- data/data/mod_spox/extras/AutoKick.rb +44 -23
- data/data/mod_spox/extras/AutoMode.rb +2 -5
- data/data/mod_spox/extras/AutoRejoin.rb +21 -0
- data/data/mod_spox/extras/Bouncer.rb +10 -10
- data/data/mod_spox/extras/Bytes.rb +12 -0
- data/data/mod_spox/extras/Confess.rb +131 -52
- data/data/mod_spox/extras/DCC.rb +189 -0
- data/data/mod_spox/extras/DevWatch.rb +32 -33
- data/data/mod_spox/extras/FloodKicker.rb +129 -0
- data/data/mod_spox/extras/GoogleIt.rb +13 -0
- data/data/mod_spox/extras/Headers.rb +31 -4
- data/data/mod_spox/extras/Karma.rb +103 -49
- data/data/mod_spox/extras/Logger.rb +45 -30
- data/data/mod_spox/extras/LolSpeak.rb +1 -1
- data/data/mod_spox/extras/NickServ.rb +83 -0
- data/data/mod_spox/extras/PhpCli.rb +12 -15
- data/data/mod_spox/extras/PhpFuncLookup.rb +57 -25
- data/data/mod_spox/extras/Quotes.rb +5 -4
- data/data/mod_spox/extras/RegexTracker.rb +160 -0
- data/data/mod_spox/extras/Roulette.rb +22 -23
- data/data/mod_spox/extras/Search.rb +3 -2
- data/data/mod_spox/extras/Slashdot.rb +35 -0
- data/data/mod_spox/extras/Topten.rb +5 -5
- data/data/mod_spox/extras/TracTicket.rb +68 -0
- data/data/mod_spox/extras/Translate.rb +69 -30
- data/data/mod_spox/extras/Twitter.rb +372 -0
- data/data/mod_spox/extras/UrbanDictionary.rb +21 -12
- data/data/mod_spox/extras/Weather.rb +1 -1
- data/data/mod_spox/plugins/Authenticator.rb +63 -30
- data/data/mod_spox/plugins/Banner.rb +164 -151
- data/data/mod_spox/plugins/Helper.rb +18 -7
- data/data/mod_spox/plugins/PluginLoader.rb +46 -22
- data/data/mod_spox/plugins/PoolConfig.rb +52 -0
- data/data/mod_spox/plugins/Quitter.rb +1 -1
- data/data/mod_spox/plugins/Status.rb +28 -0
- data/lib/mod_spox/Action.rb +20 -3
- data/lib/mod_spox/BaseConfig.rb +1 -0
- data/lib/mod_spox/Bot.rb +98 -75
- data/lib/mod_spox/BotConfig.rb +14 -6
- data/lib/mod_spox/ConfigurationWizard.rb +94 -105
- data/lib/mod_spox/Database.rb +33 -13
- data/lib/mod_spox/Helpers.rb +67 -38
- data/lib/mod_spox/Loader.rb +25 -5
- data/lib/mod_spox/Logger.rb +20 -62
- data/lib/mod_spox/MessageFactory.rb +34 -25
- data/lib/mod_spox/Monitors.rb +5 -0
- data/lib/mod_spox/Pipeline.rb +40 -51
- data/lib/mod_spox/Plugin.rb +40 -9
- data/lib/mod_spox/PluginManager.rb +46 -38
- data/lib/mod_spox/Pool.rb +129 -143
- data/lib/mod_spox/Socket.rb +41 -50
- data/lib/mod_spox/Sockets.rb +211 -0
- data/lib/mod_spox/Timer.rb +86 -69
- data/lib/mod_spox/handlers/BadNick.rb +1 -1
- data/lib/mod_spox/handlers/Created.rb +1 -1
- data/lib/mod_spox/handlers/Handler.rb +9 -0
- data/lib/mod_spox/handlers/Invite.rb +1 -1
- data/lib/mod_spox/handlers/Join.rb +2 -2
- data/lib/mod_spox/handlers/Kick.rb +1 -1
- data/lib/mod_spox/handlers/LuserChannels.rb +1 -1
- data/lib/mod_spox/handlers/LuserOp.rb +1 -1
- data/lib/mod_spox/handlers/LuserUnknown.rb +1 -1
- data/lib/mod_spox/handlers/Mode.rb +2 -2
- data/lib/mod_spox/handlers/MyInfo.rb +1 -1
- data/lib/mod_spox/handlers/Names.rb +1 -1
- data/lib/mod_spox/handlers/Nick.rb +20 -3
- data/lib/mod_spox/handlers/NickInUse.rb +3 -3
- data/lib/mod_spox/handlers/Notice.rb +5 -15
- data/lib/mod_spox/handlers/Part.rb +1 -1
- data/lib/mod_spox/handlers/Ping.rb +1 -1
- data/lib/mod_spox/handlers/Pong.rb +1 -1
- data/lib/mod_spox/handlers/Privmsg.rb +2 -2
- data/lib/mod_spox/handlers/Quit.rb +1 -1
- data/lib/mod_spox/handlers/Topic.rb +2 -1
- data/lib/mod_spox/handlers/Welcome.rb +3 -3
- data/lib/mod_spox/handlers/Who.rb +9 -7
- data/lib/mod_spox/handlers/Whois.rb +29 -16
- data/lib/mod_spox/handlers/YourHost.rb +1 -1
- data/lib/mod_spox/messages/incoming/Privmsg.rb +38 -19
- data/lib/mod_spox/messages/internal/DCCListener.rb +12 -0
- data/lib/mod_spox/messages/internal/DCCRequest.rb +12 -0
- data/lib/mod_spox/messages/internal/DCCSocket.rb +19 -0
- data/lib/mod_spox/messages/internal/StatusRequest.rb +2 -1
- data/lib/mod_spox/messages/outgoing/Privmsg.rb +21 -5
- data/lib/mod_spox/migrations/001_initialize_models.rb +115 -0
- data/lib/mod_spox/models/Auth.rb +24 -16
- data/lib/mod_spox/models/AuthGroup.rb +4 -3
- data/lib/mod_spox/models/Channel.rb +20 -12
- data/lib/mod_spox/models/ChannelMode.rb +2 -2
- data/lib/mod_spox/models/Config.rb +11 -3
- data/lib/mod_spox/models/Group.rb +6 -1
- data/lib/mod_spox/models/Nick.rb +93 -33
- data/lib/mod_spox/models/NickChannel.rb +8 -6
- data/lib/mod_spox/models/NickGroup.rb +16 -0
- data/lib/mod_spox/models/NickMode.rb +3 -3
- data/lib/mod_spox/models/Server.rb +6 -2
- data/lib/mod_spox/models/Setting.rb +12 -6
- data/lib/mod_spox/models/Signature.rb +7 -13
- data/lib/mod_spox/models/Trigger.rb +1 -1
- metadata +125 -100
data/CHANGELOG
CHANGED
|
@@ -1,3 +1,39 @@
|
|
|
1
|
+
0.2.0 Release (Beta status)
|
|
2
|
+
Core:
|
|
3
|
+
* Removed support for MySQL and SQLite (SQLite support may be added at a later date)
|
|
4
|
+
* Rebuilt and optimized timer
|
|
5
|
+
* Rebuilt and optimized pooling
|
|
6
|
+
* Fixed authentication bugs
|
|
7
|
+
* Added basic DCC support (still in alpha state)
|
|
8
|
+
* Added daemon support
|
|
9
|
+
* Updated tinyurl helper to use api
|
|
10
|
+
* Updated format_seconds helper
|
|
11
|
+
* Added a format_bytes helper method
|
|
12
|
+
* Fixed PluginManager to handle bad plugins better
|
|
13
|
+
* termios support has been removed
|
|
14
|
+
* Tested for full support on Ruby 1.8 and Ruby 1.9
|
|
15
|
+
* Tested for alpha support on JRuby > 1.1.3
|
|
16
|
+
Plugins:
|
|
17
|
+
* New plugins added:
|
|
18
|
+
* Status - Status and version information from the bot
|
|
19
|
+
* NickServ - Identify with services
|
|
20
|
+
* Twitter - Use twitter via IRC
|
|
21
|
+
* GoogleIt - Will help people unfamiliar with google
|
|
22
|
+
* Slashdot - Last 5 from the Slashdot feed
|
|
23
|
+
* PoolConfig - Configure bot thread pooling
|
|
24
|
+
* RegexTracker - Track regular expressions found in privmsgs
|
|
25
|
+
* TracTicket - Add help tickets to a trac system
|
|
26
|
+
* DCC - Basic DCC chat and file server (alpha state - only works with some clients)
|
|
27
|
+
* AutoRejoin plugin will automatically join channels on connect
|
|
28
|
+
* Confess fixed to use it's own sqlite database. See: http://dev.modspox.com/cgi-bin/trac.cgi/wiki/ConfessSqlite
|
|
29
|
+
* Headers fixed to support http and https plus support for non-standard ports
|
|
30
|
+
* PhpLookup fixed for new manual layout
|
|
31
|
+
* Translate fixed to interact with yahoo properly
|
|
32
|
+
* Karma now has standardized parenthesis usage as well as anti-karma
|
|
33
|
+
|
|
34
|
+
Lots of other fixes throughout. Clean install is recommended. Please read the install
|
|
35
|
+
guide for an overview of what information you will need and what setup is required.
|
|
36
|
+
|
|
1
37
|
0.1.0.1 Release (Bug fix)
|
|
2
38
|
* Fix made to work with sequel 2.2
|
|
3
39
|
|
data/INSTALL
CHANGED
|
@@ -5,11 +5,11 @@ gem install --include-dependencies mod_spox
|
|
|
5
5
|
Requirements include:
|
|
6
6
|
* sequel
|
|
7
7
|
* database driver
|
|
8
|
-
* Ruby >= 1.8.
|
|
8
|
+
* Ruby >= 1.8.6
|
|
9
9
|
|
|
10
10
|
Optional:
|
|
11
11
|
* fastthread
|
|
12
12
|
* termios
|
|
13
13
|
|
|
14
14
|
More detailed information can be found at:
|
|
15
|
-
http://dev.modspox.com/cgi-bin/trac.cgi/wiki/InstallHowto
|
|
15
|
+
http://dev.modspox.com/cgi-bin/trac.cgi/wiki/InstallHowto
|
data/README
CHANGED
data/bin/mod_spox
CHANGED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
## include our needed libraries ##
|
|
4
4
|
|
|
5
|
-
['rubygems', 'sequel', 'thread', 'etc', 'getoptlong'].each
|
|
5
|
+
['rubygems', 'sequel', 'thread', 'etc', 'getoptlong', 'logger'].each do |file|
|
|
6
6
|
begin
|
|
7
7
|
require file
|
|
8
8
|
rescue Object => boom
|
|
9
9
|
puts "ERROR: Failed to load required library: #{file}"
|
|
10
10
|
exit 1
|
|
11
11
|
end
|
|
12
|
-
|
|
12
|
+
end
|
|
13
13
|
|
|
14
14
|
## optional libraries ##
|
|
15
15
|
begin
|
|
@@ -18,15 +18,21 @@ rescue Object => boom
|
|
|
18
18
|
# ignore if not found #
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
-
$BOTVERSION='0.
|
|
21
|
+
$BOTVERSION='0.2.0'
|
|
22
|
+
$BOTCODENAME='avocado'
|
|
22
23
|
$VERBOSITY = 0
|
|
23
24
|
$MOD_SPOX_PATH = nil
|
|
25
|
+
$DAEMON_BOT = false
|
|
26
|
+
$LOGTO = $stdout
|
|
27
|
+
$LOGLEVEL = :fatal
|
|
28
|
+
$JDBC = false
|
|
29
|
+
|
|
24
30
|
Sequel::Model.unrestrict_primary_key
|
|
25
31
|
|
|
26
32
|
begin
|
|
27
33
|
require 'mod_spox/Loader'
|
|
28
34
|
rescue
|
|
29
|
-
|
|
35
|
+
puts 'ERROR: Failed to load mod_spox'
|
|
30
36
|
exit 1
|
|
31
37
|
end
|
|
32
38
|
include ModSpox
|
|
@@ -34,40 +40,73 @@ include ModSpox
|
|
|
34
40
|
opts = GetoptLong.new(
|
|
35
41
|
['--config', '-c', GetoptLong::NO_ARGUMENT],
|
|
36
42
|
['--debug', '-d', GetoptLong::OPTIONAL_ARGUMENT],
|
|
43
|
+
['--verbosity', '-V', GetoptLong::OPTIONAL_ARGUMENT],
|
|
37
44
|
['--version', '-v', GetoptLong::NO_ARGUMENT],
|
|
45
|
+
['--jdbc', '-j', GetoptLong::NO_ARGUMENT],
|
|
38
46
|
['--help', '-h', GetoptLong::NO_ARGUMENT],
|
|
39
|
-
['--path', '-p', GetoptLong::REQUIRED_ARGUMENT]
|
|
47
|
+
['--path', '-p', GetoptLong::REQUIRED_ARGUMENT],
|
|
48
|
+
['--daemon', '-D', GetoptLong::NO_ARGUMENT]
|
|
40
49
|
)
|
|
41
50
|
verbose = 0
|
|
42
51
|
opts.each do |opt, arg|
|
|
43
52
|
case opt
|
|
44
53
|
when '--help'
|
|
45
54
|
puts 'Usage: mod_spox [opts]'
|
|
46
|
-
puts '--config -c:
|
|
47
|
-
puts '--
|
|
48
|
-
puts '--
|
|
49
|
-
puts '--
|
|
55
|
+
puts '--config -c: starts configuration wizard'
|
|
56
|
+
puts '--path -p /config/path path to configuration directory'
|
|
57
|
+
puts '--jdbc -j use jdbc database driver (jruby)'
|
|
58
|
+
puts '--debug -d [logfile]: turns on debugging and outputs to file (default STDOUT)'
|
|
59
|
+
puts '--verbosity -V [(info|warn|fatal)]: verbosity of debug output (default fatal)'
|
|
60
|
+
puts '--deamon -D: daemonizes the process'
|
|
61
|
+
puts '--version -v: output bot version information'
|
|
62
|
+
puts '--help -h: print this help message'
|
|
50
63
|
exit
|
|
51
64
|
when '--version'
|
|
52
65
|
puts "mod_spox IRC bot version: #{$BOTVERSION}"
|
|
53
66
|
puts 'http://rubyforge.org/projects/modspox'
|
|
54
67
|
exit
|
|
68
|
+
when '--jdbc'
|
|
69
|
+
$JDBC = true
|
|
70
|
+
begin
|
|
71
|
+
require 'jdbc/postgres'
|
|
72
|
+
rescue Object => boom
|
|
73
|
+
puts 'Failed to load JDBC Postgres gem'
|
|
74
|
+
exit 1
|
|
75
|
+
end
|
|
55
76
|
when '--debug'
|
|
56
|
-
if(arg && arg
|
|
57
|
-
$
|
|
77
|
+
if(arg && File.writable?(arg))
|
|
78
|
+
$LOGTO = arg
|
|
79
|
+
else
|
|
80
|
+
$LOGTO = $stdout
|
|
58
81
|
end
|
|
59
82
|
when '--config'
|
|
60
83
|
require 'mod_spox/ConfigurationWizard'
|
|
61
84
|
wizard = ConfigurationWizard.new
|
|
62
|
-
wizard.run
|
|
85
|
+
BotConfig.configured? ? wizard.update : wizard.run
|
|
63
86
|
exit
|
|
64
87
|
when '--path'
|
|
65
88
|
$MOD_SPOX_PATH = arg
|
|
89
|
+
when '--daemon'
|
|
90
|
+
begin
|
|
91
|
+
$DAEMON_BOT = true
|
|
92
|
+
require 'daemons'
|
|
93
|
+
rescue Object => boom
|
|
94
|
+
puts 'Error: You must install the Daemons gem: (http://daemons.rubyforge.org)'
|
|
95
|
+
exit 1
|
|
96
|
+
end
|
|
97
|
+
when '--verbosity'
|
|
98
|
+
if(arg && arg =~ /^(info|warn|fatal)$/)
|
|
99
|
+
$LOGLEVEL = arg.to_sym
|
|
100
|
+
end
|
|
66
101
|
end
|
|
67
102
|
end
|
|
68
103
|
|
|
69
104
|
initialize_bot
|
|
70
105
|
require 'mod_spox/Bot'
|
|
71
106
|
|
|
107
|
+
if($DAEMON_BOT)
|
|
108
|
+
Daemonize.daemonize(nil, 'mod_spox')
|
|
109
|
+
end
|
|
110
|
+
|
|
72
111
|
bot = Bot.new
|
|
73
112
|
bot.run
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
class AOLSpeak < ModSpox::Plugin
|
|
2
2
|
|
|
3
3
|
include Models
|
|
4
|
-
|
|
4
|
+
|
|
5
5
|
def initialize(pipeline)
|
|
6
6
|
super
|
|
7
7
|
group = Group.find_or_create(:name => 'banner')
|
|
@@ -9,20 +9,13 @@ class AOLSpeak < ModSpox::Plugin
|
|
|
9
9
|
Signature.find_or_create(:signature => 'aolkick (\S+) ?(\S+)?', :plugin => name, :method => 'aolkick', :description => 'AOL speak kick',
|
|
10
10
|
:group_id => group.pk).params = [:nick, :channel]
|
|
11
11
|
build_aolspeak
|
|
12
|
-
@banner = nil
|
|
13
|
-
@pipeline.hook(self, :banner_watch, :Internal_PluginResponse)
|
|
14
|
-
@pipeline << Messages::Internal::PluginRequest.new(self, 'Banner')
|
|
15
12
|
end
|
|
16
|
-
|
|
13
|
+
|
|
17
14
|
def aolspeak(message, params)
|
|
18
15
|
reply message.replyto, @aolspeak[rand(@aolspeak.size) - 1]
|
|
19
16
|
end
|
|
20
|
-
|
|
17
|
+
|
|
21
18
|
def aolkick(message, params)
|
|
22
|
-
if(@banner.nil?)
|
|
23
|
-
@pipeline << Messages::Internal::PluginRequest.new(self, 'Banner')
|
|
24
|
-
sleep(0.1)
|
|
25
|
-
end
|
|
26
19
|
if(params[:channel])
|
|
27
20
|
channel = Models::Channel.filter(:name => params[:channel]).first
|
|
28
21
|
else
|
|
@@ -30,21 +23,15 @@ class AOLSpeak < ModSpox::Plugin
|
|
|
30
23
|
end
|
|
31
24
|
nick = Helpers.find_model(params[:nick], false)
|
|
32
25
|
if(channel && nick)
|
|
33
|
-
@
|
|
26
|
+
@pipeline << plugin_const(:Banner_Ban).new(nick, channel, :kickban, @aolspeak[rand(@aolspeak.size) - 1], 60, false, false)
|
|
34
27
|
else
|
|
35
28
|
reply message.replyto, "\2Error:\2 Failed to find channel: #{params[:channel]}" unless channel
|
|
36
29
|
reply message.replyto, "\2Error:\2 Failed to find nick: #{params[:nick]}" unless nick
|
|
37
30
|
end
|
|
38
31
|
end
|
|
39
32
|
|
|
40
|
-
def banner_watch(message)
|
|
41
|
-
if(message.origin == self && message.found?)
|
|
42
|
-
@banner = message.plugin
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
|
|
46
33
|
private
|
|
47
|
-
|
|
34
|
+
|
|
48
35
|
def build_aolspeak
|
|
49
36
|
@aolspeak = [
|
|
50
37
|
'ALL OREAND THE GIFCHERRY BUSH DA BOON CHASED DA WHEASELGIFPASTECLITNUGGET SHIT]',
|
|
@@ -16,15 +16,13 @@ class AutoKick < ModSpox::Plugin
|
|
|
16
16
|
:group_id => group.pk, :description => 'Remove an autokick rule').params = [:id]
|
|
17
17
|
Signature.find_or_create(:signature => 'autokick colors ?(on|off)?', :plugin => name, :method => 'colors',
|
|
18
18
|
:group_id => group.pk, :description => 'Kick user for using colors', :requirement => 'public').params = [:action]
|
|
19
|
-
@pipeline.hook(self, :banner_watch, :Internal_PluginResponse)
|
|
20
|
-
@banner = nil
|
|
21
19
|
@map = nil
|
|
22
20
|
@colors = Setting[:colorkick]
|
|
23
|
-
@colors = Array.new
|
|
21
|
+
@colors = Array.new unless @colors.is_a?(Array)
|
|
24
22
|
AutoKickRecord.create_table unless AutoKickRecord.table_exists?
|
|
25
23
|
do_listen
|
|
26
24
|
end
|
|
27
|
-
|
|
25
|
+
|
|
28
26
|
def colors(message, params)
|
|
29
27
|
if(params[:action])
|
|
30
28
|
if(params[:action] == 'on')
|
|
@@ -32,12 +30,16 @@ class AutoKick < ModSpox::Plugin
|
|
|
32
30
|
reply message.replyto, 'Colored autokick is already enabled'
|
|
33
31
|
else
|
|
34
32
|
@colors << message.target.pk
|
|
35
|
-
Setting
|
|
33
|
+
record = Setting.find_or_create(:name => 'colorkick')
|
|
34
|
+
record.value = @colors
|
|
35
|
+
record.save
|
|
36
36
|
reply message.replyto, 'Colored autokick has been enabled'
|
|
37
37
|
end
|
|
38
38
|
else
|
|
39
39
|
@colors.delete(message.target.pk)
|
|
40
|
-
Setting
|
|
40
|
+
record = Setting.find_or_create(:name => 'colorkick')
|
|
41
|
+
record.value = @colors
|
|
42
|
+
record.save
|
|
41
43
|
reply message.replyto, 'Colored autokick has been disabled'
|
|
42
44
|
end
|
|
43
45
|
else
|
|
@@ -45,7 +47,7 @@ class AutoKick < ModSpox::Plugin
|
|
|
45
47
|
reply message.replyto, "Colored autokick is currently \2#{status}\2"
|
|
46
48
|
end
|
|
47
49
|
end
|
|
48
|
-
|
|
50
|
+
|
|
49
51
|
def list(message, params)
|
|
50
52
|
records = AutoKickRecord.all
|
|
51
53
|
unless(records.empty?)
|
|
@@ -56,7 +58,7 @@ class AutoKick < ModSpox::Plugin
|
|
|
56
58
|
reply message.replyto, 'No rules currently enabled'
|
|
57
59
|
end
|
|
58
60
|
end
|
|
59
|
-
|
|
61
|
+
|
|
60
62
|
def add(message, params)
|
|
61
63
|
if(params[:channel])
|
|
62
64
|
channel = Channel.filter(:name => params[:channel]).first
|
|
@@ -71,7 +73,7 @@ class AutoKick < ModSpox::Plugin
|
|
|
71
73
|
reply message.replyto, "\2Error:\2 I have no record of #{params[:channel]}. Failed to add autokick rule."
|
|
72
74
|
end
|
|
73
75
|
end
|
|
74
|
-
|
|
76
|
+
|
|
75
77
|
def remove(message, params)
|
|
76
78
|
record = AutoKickRecord[params[:id].to_i]
|
|
77
79
|
if(record)
|
|
@@ -82,32 +84,33 @@ class AutoKick < ModSpox::Plugin
|
|
|
82
84
|
reply message.replyto, "\2Error:\2 Failed to find an autokick rule with ID: #{params[:id]}"
|
|
83
85
|
end
|
|
84
86
|
end
|
|
85
|
-
|
|
87
|
+
|
|
86
88
|
def listener(message)
|
|
89
|
+
return unless message.is_public?
|
|
87
90
|
if(@map.keys.include?(message.target.pk))
|
|
91
|
+
bmessage = nil
|
|
92
|
+
btime = 0
|
|
88
93
|
@map[message.target.pk].each do |pattern|
|
|
89
94
|
reg = Regexp.new(pattern, Regexp::IGNORECASE)
|
|
90
95
|
unless(reg.match(message.message).nil?)
|
|
91
96
|
record = AutoKickRecord.filter(:pattern => pattern).first
|
|
92
|
-
|
|
97
|
+
bmessage = record.message
|
|
98
|
+
btime += record.bantime
|
|
93
99
|
end
|
|
94
|
-
end
|
|
100
|
+
end
|
|
101
|
+
unless(bmessage.nil?)
|
|
102
|
+
@pipeline << plugin_const(:Banner_Ban).new(message.source, message.target, :kickban, bmessage, btime, false, true)
|
|
103
|
+
end
|
|
95
104
|
end
|
|
96
105
|
if(@colors.include?(message.target.pk))
|
|
97
106
|
if(message.is_colored?)
|
|
98
|
-
@
|
|
107
|
+
@pipeline << plugin_const(:Banner_Ban).new(message.source, message.target, :kickban, 'No color codes allowed', 60, false, true)
|
|
99
108
|
end
|
|
100
109
|
end
|
|
101
110
|
end
|
|
102
|
-
|
|
103
|
-
def banner_watch(message)
|
|
104
|
-
if(message.origin == self && message.found?)
|
|
105
|
-
@banner = message.plugin
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
|
|
111
|
+
|
|
109
112
|
private
|
|
110
|
-
|
|
113
|
+
|
|
111
114
|
def do_listen
|
|
112
115
|
@map = nil
|
|
113
116
|
begin
|
|
@@ -122,11 +125,10 @@ class AutoKick < ModSpox::Plugin
|
|
|
122
125
|
@map[record.channel_id] = [] unless @map[record.channel_id]
|
|
123
126
|
@map[record.channel_id] << record.pattern
|
|
124
127
|
end
|
|
125
|
-
@pipeline << Messages::Internal::PluginRequest.new(self, 'Banner')
|
|
126
128
|
@pipeline.hook(self, :listener, :Incoming_Privmsg)
|
|
127
129
|
end
|
|
128
130
|
end
|
|
129
|
-
|
|
131
|
+
|
|
130
132
|
class AutoKickRecord < Sequel::Model
|
|
131
133
|
set_schema do
|
|
132
134
|
primary_key :id
|
|
@@ -135,6 +137,25 @@ class AutoKick < ModSpox::Plugin
|
|
|
135
137
|
text :message, :null => false
|
|
136
138
|
foreign_key :channel_id, :table => :channels
|
|
137
139
|
end
|
|
140
|
+
|
|
141
|
+
def channel
|
|
142
|
+
ModSpox::Models::Channel[channel_id]
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
class AutoKickPersonal < Sequel::Model
|
|
147
|
+
set_schema do
|
|
148
|
+
primary_key :id
|
|
149
|
+
varchar :pattern, :default => nil
|
|
150
|
+
integer :bantime, :null => false, :default => 60
|
|
151
|
+
varchar :message, :null => false
|
|
152
|
+
foreign_key :nick_id, :table => :nicks
|
|
153
|
+
foreign_key :channel_id, :table => :channels
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def nick
|
|
157
|
+
ModSpox::Models::Nick[nick_id]
|
|
158
|
+
end
|
|
138
159
|
|
|
139
160
|
def channel
|
|
140
161
|
ModSpox::Models::Channel[channel_id]
|
|
@@ -54,11 +54,8 @@ class AutoMode < ModSpox::Plugin
|
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
def voice(m, p)
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
@pipeline << Messages::Outgoing::ChannelMode.new(m.target, '+v', m.source.nick) if me.is_op?(m.target)
|
|
60
|
-
else
|
|
61
|
-
reply m.replyto, "\2Error:\2 You are not listed on the auto-voice list"
|
|
57
|
+
ModeRecord.filter(:nick_id => m.source.pk, :channel_id => m.target.pk).each do |record|
|
|
58
|
+
@pipeline << Messages::Outgoing::ChannelMode.new(m.target, '+v', m.source.nick) if me.is_op?(m.target) && record.voice
|
|
62
59
|
end
|
|
63
60
|
end
|
|
64
61
|
|
|
@@ -3,6 +3,9 @@ class AutoRejoin < ModSpox::Plugin
|
|
|
3
3
|
def initialize(pipeline)
|
|
4
4
|
super
|
|
5
5
|
@pipeline.hook(self, :check_kick, :Incoming_Kick)
|
|
6
|
+
@pipeline.hook(self, :check_join, :Incoming_Join)
|
|
7
|
+
@pipeline.hook(self, :check_part, :Incoming_Part)
|
|
8
|
+
@pipeline.hook(self, :do_joins, :Incoming_Welcome)
|
|
6
9
|
end
|
|
7
10
|
|
|
8
11
|
def check_kick(message)
|
|
@@ -10,5 +13,23 @@ class AutoRejoin < ModSpox::Plugin
|
|
|
10
13
|
@pipeline << Messages::Outgoing::Join.new(message.channel)
|
|
11
14
|
end
|
|
12
15
|
end
|
|
16
|
+
|
|
17
|
+
def check_join(m)
|
|
18
|
+
if(m.nick == me)
|
|
19
|
+
m.channel.update(:autojoin => true)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def check_part(m)
|
|
24
|
+
if(m.nick == me)
|
|
25
|
+
m.channel.update(:autojoin => false)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def do_joins(m)
|
|
30
|
+
Models::Channel.filter(:autojoin => true).each do |channel|
|
|
31
|
+
@pipeline << Messages::Outgoing::Join.new(channel)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
13
34
|
|
|
14
35
|
end
|
|
@@ -28,7 +28,7 @@ class Bouncer < ModSpox::Plugin
|
|
|
28
28
|
|
|
29
29
|
def get_msgs(message)
|
|
30
30
|
unless(@clients.empty?)
|
|
31
|
-
Logger.
|
|
31
|
+
Logger.info("BOUNCER: Sending to #{@clients.size} clients")
|
|
32
32
|
@clients.each do |client|
|
|
33
33
|
begin
|
|
34
34
|
if(message.raw_content.is_a?(Array))
|
|
@@ -107,18 +107,18 @@ class Bouncer < ModSpox::Plugin
|
|
|
107
107
|
until(@socket.closed?)
|
|
108
108
|
begin
|
|
109
109
|
new_con = @socket.accept_nonblock
|
|
110
|
-
Logger.
|
|
110
|
+
Logger.info("BOUNCER: New connection established on bouncer")
|
|
111
111
|
@clients << {
|
|
112
112
|
:connection => new_con,
|
|
113
113
|
:thread => Thread.new(new_con) do | con |
|
|
114
114
|
begin
|
|
115
|
-
Logger.
|
|
115
|
+
Logger.info("CONNECTION: #{con}")
|
|
116
116
|
until(con.closed?)
|
|
117
|
-
Logger.
|
|
117
|
+
Logger.info("WAITING FOR STUFF ON :#{con}")
|
|
118
118
|
Kernel.select([con], nil, nil, nil)
|
|
119
|
-
Logger.
|
|
119
|
+
Logger.info("Woken up and ready to read")
|
|
120
120
|
string = con.gets
|
|
121
|
-
Logger.
|
|
121
|
+
Logger.info("BOUNCER GOT MESSAGE: #{string}")
|
|
122
122
|
if(string.empty?)
|
|
123
123
|
raise Exception.new("EMPTY STRING")
|
|
124
124
|
else
|
|
@@ -126,7 +126,7 @@ class Bouncer < ModSpox::Plugin
|
|
|
126
126
|
end
|
|
127
127
|
end
|
|
128
128
|
rescue Object => boom
|
|
129
|
-
Logger.
|
|
129
|
+
Logger.warn("THREAD BOUNCER ERROR: #{boom}")
|
|
130
130
|
end
|
|
131
131
|
end
|
|
132
132
|
}
|
|
@@ -139,7 +139,7 @@ class Bouncer < ModSpox::Plugin
|
|
|
139
139
|
end
|
|
140
140
|
start_processor
|
|
141
141
|
else
|
|
142
|
-
Logger.
|
|
142
|
+
Logger.warn("Error: Bouncer was not started. Failed to find set port number")
|
|
143
143
|
end
|
|
144
144
|
end
|
|
145
145
|
|
|
@@ -158,7 +158,7 @@ class Bouncer < ModSpox::Plugin
|
|
|
158
158
|
begin
|
|
159
159
|
while(@listener) do
|
|
160
160
|
info = @to_server.pop
|
|
161
|
-
Logger.
|
|
161
|
+
Logger.info("Processing message: #{info[:message]}")
|
|
162
162
|
if(info[:message] =~ /^USER\s/i)
|
|
163
163
|
initialize_connection(info[:socket])
|
|
164
164
|
else
|
|
@@ -166,7 +166,7 @@ class Bouncer < ModSpox::Plugin
|
|
|
166
166
|
end
|
|
167
167
|
end
|
|
168
168
|
rescue Object => boom
|
|
169
|
-
Logger.
|
|
169
|
+
Logger.warn("BOUNCER ERROR: #{boom}")
|
|
170
170
|
unless(@clients.empty?)
|
|
171
171
|
@clients.each do |socket|
|
|
172
172
|
socket[:connection].close
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
class Bytes < ModSpox::Plugin
|
|
2
|
+
include Models
|
|
3
|
+
def initialize(args)
|
|
4
|
+
super
|
|
5
|
+
Signature.find_or_create(:signature => 'bytes (\d+)', :plugin => name, :method => 'convert',
|
|
6
|
+
:description => 'Convert bytes to human readable string').params = [:bytes]
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def convert(message, params)
|
|
10
|
+
reply message.replyto, "#{params[:bytes]} is roughly #{Helpers.format_size(params[:bytes].to_i)}"
|
|
11
|
+
end
|
|
12
|
+
end
|