mod_spox 0.2.0 → 0.3.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 +31 -1
- data/LICENSE +674 -0
- data/README.rdoc +73 -0
- data/bin/mod_spox +28 -28
- data/data/mod_spox/extras/AOLSpeak.rb +2 -3
- data/data/mod_spox/extras/AutoKick.rb +10 -23
- data/data/mod_spox/extras/AutoMode.rb +12 -23
- data/data/mod_spox/extras/Bash.rb +55 -0
- data/data/mod_spox/extras/Bouncer.rb +85 -57
- data/data/mod_spox/extras/Bullshit.rb +1 -1
- data/data/mod_spox/extras/Bytes.rb +1 -2
- data/data/mod_spox/extras/Confess.rb +27 -29
- data/data/mod_spox/extras/DCC.rb +11 -20
- data/data/mod_spox/extras/DevWatch.rb +21 -23
- data/data/mod_spox/extras/DownForEveryoneOrJustMe.rb +47 -0
- data/data/mod_spox/extras/EightBall.rb +1 -1
- data/data/mod_spox/extras/FML.rb +35 -0
- data/data/mod_spox/extras/Headers.rb +31 -50
- data/data/mod_spox/extras/Karma.rb +81 -29
- data/data/mod_spox/extras/Logger.rb +2 -2
- data/data/mod_spox/extras/LolSpeak.rb +1 -2
- data/data/mod_spox/extras/PhpCli.rb +138 -8
- data/data/mod_spox/extras/PhpFuncLookup.rb +20 -23
- data/data/mod_spox/extras/Pinger.rb +1 -1
- data/data/mod_spox/extras/Quotes.rb +8 -10
- data/data/mod_spox/extras/RegexTracker.rb +2 -4
- data/data/mod_spox/extras/Roulette.rb +20 -27
- data/data/mod_spox/extras/RubyCli.rb +93 -0
- data/data/mod_spox/extras/Search.rb +17 -3
- data/data/mod_spox/extras/Seen.rb +150 -0
- data/data/mod_spox/extras/SlashdotHeadlineGenerator.rb +500 -0
- data/data/mod_spox/extras/Talk.rb +2 -4
- data/data/mod_spox/extras/Topten.rb +10 -12
- data/data/mod_spox/extras/TracTicket.rb +3 -5
- data/data/mod_spox/extras/Translate.rb +20 -22
- data/data/mod_spox/extras/Twitter.rb +118 -33
- data/data/mod_spox/extras/UrbanDictionary.rb +8 -17
- data/data/mod_spox/extras/Weather.rb +1 -2
- data/data/mod_spox/plugins/Authenticator.rb +93 -98
- data/data/mod_spox/plugins/Banner.rb +26 -56
- data/data/mod_spox/plugins/Helper.rb +5 -6
- data/data/mod_spox/plugins/Initializer.rb +4 -14
- data/data/mod_spox/plugins/Joiner.rb +1 -1
- data/data/mod_spox/plugins/Nicker.rb +13 -0
- data/data/mod_spox/plugins/Parter.rb +2 -2
- data/data/mod_spox/plugins/Permissions.rb +60 -0
- data/data/mod_spox/plugins/PluginLoader.rb +7 -12
- data/data/mod_spox/plugins/Ponger.rb +51 -0
- data/data/mod_spox/plugins/Quitter.rb +1 -2
- data/data/mod_spox/plugins/Servers.rb +57 -0
- data/data/mod_spox/plugins/Status.rb +3 -2
- data/data/mod_spox/plugins/Triggers.rb +9 -9
- data/lib/mod_spox/Bot.rb +109 -33
- data/lib/mod_spox/BotConfig.rb +2 -2
- data/lib/mod_spox/ConfigurationWizard.rb +12 -12
- data/lib/mod_spox/Database.rb +1 -4
- data/lib/mod_spox/Exceptions.rb +26 -0
- data/lib/mod_spox/Helpers.rb +29 -68
- data/lib/mod_spox/Loader.rb +23 -24
- data/lib/mod_spox/Logger.rb +19 -17
- data/lib/mod_spox/MessageFactory.rb +50 -24
- data/lib/mod_spox/Pipeline.rb +21 -7
- data/lib/mod_spox/Plugin.rb +27 -3
- data/lib/mod_spox/PluginManager.rb +28 -15
- data/lib/mod_spox/PriorityQueue.rb +69 -0
- data/lib/mod_spox/Socket.rb +93 -51
- data/lib/mod_spox/Sockets.rb +76 -63
- data/lib/mod_spox/Timer.rb +21 -141
- data/lib/mod_spox/Version.rb +14 -0
- data/lib/mod_spox/handlers/BadNick.rb +1 -1
- data/lib/mod_spox/handlers/Bounce.rb +5 -5
- data/lib/mod_spox/handlers/Created.rb +13 -5
- data/lib/mod_spox/handlers/Handler.rb +12 -3
- data/lib/mod_spox/handlers/Invite.rb +14 -8
- data/lib/mod_spox/handlers/Join.rb +24 -20
- data/lib/mod_spox/handlers/Kick.rb +22 -13
- data/lib/mod_spox/handlers/Mode.rb +42 -36
- data/lib/mod_spox/handlers/Motd.rb +4 -0
- data/lib/mod_spox/handlers/Names.rb +66 -39
- data/lib/mod_spox/handlers/Nick.rb +20 -14
- data/lib/mod_spox/handlers/Part.rb +25 -8
- data/lib/mod_spox/handlers/Ping.rb +11 -5
- data/lib/mod_spox/handlers/Pong.rb +9 -5
- data/lib/mod_spox/handlers/Privmsg.rb +25 -17
- data/lib/mod_spox/handlers/Quit.rb +13 -8
- data/lib/mod_spox/handlers/Topic.rb +4 -0
- data/lib/mod_spox/handlers/Welcome.rb +16 -24
- data/lib/mod_spox/handlers/Who.rb +64 -48
- data/lib/mod_spox/handlers/Whois.rb +92 -60
- data/lib/mod_spox/messages/incoming/Nick.rb +2 -2
- data/lib/mod_spox/messages/incoming/Privmsg.rb +1 -1
- data/lib/mod_spox/messages/incoming/Whois.rb +1 -0
- data/lib/mod_spox/messages/internal/EstablishConnection.rb +1 -1
- data/lib/mod_spox/messages/internal/PluginsReady.rb +10 -0
- data/lib/mod_spox/messages/internal/QueueSocket.rb +8 -0
- data/lib/mod_spox/messages/internal/Reconnect.rb +8 -0
- data/lib/mod_spox/messages/internal/UnqueueSocket.rb +8 -0
- data/lib/mod_spox/migrations/002_persistent_sigs.rb +14 -0
- data/lib/mod_spox/migrations/003_auth_restructure.rb +31 -0
- data/lib/mod_spox/migrations/004_mode_index_fix.rb +18 -0
- data/lib/mod_spox/migrations/005_nick_mode_nopark.rb +18 -0
- data/lib/mod_spox/models/Auth.rb +16 -46
- data/lib/mod_spox/models/AuthMask.rb +13 -0
- data/lib/mod_spox/models/Channel.rb +46 -27
- data/lib/mod_spox/models/Config.rb +10 -19
- data/lib/mod_spox/models/Group.rb +20 -8
- data/lib/mod_spox/models/Models.rb +1 -1
- data/lib/mod_spox/models/Nick.rb +105 -113
- data/lib/mod_spox/models/NickMode.rb +23 -9
- data/lib/mod_spox/models/Server.rb +12 -1
- data/lib/mod_spox/models/Setting.rb +12 -16
- data/lib/mod_spox/models/Signature.rb +28 -8
- data/tests/BotHolder.rb +24 -0
- data/tests/handlers/tc_BadNick.rb +21 -0
- data/tests/handlers/tc_Created.rb +24 -0
- data/tests/handlers/tc_Invite.rb +50 -0
- data/tests/handlers/tc_Join.rb +33 -0
- data/tests/handlers/tc_Kick.rb +32 -0
- data/tests/handlers/tc_Mode.rb +85 -0
- data/tests/handlers/tc_Names.rb +35 -0
- data/tests/handlers/tc_Nick.rb +55 -0
- data/tests/handlers/tc_Part.rb +44 -0
- data/tests/handlers/tc_Ping.rb +40 -0
- data/tests/handlers/tc_Pong.rb +28 -0
- data/tests/handlers/tc_Privmsg.rb +85 -0
- data/tests/handlers/tc_Quit.rb +40 -0
- data/tests/handlers/tc_Who.rb +50 -0
- data/tests/handlers/tc_Whois.rb +61 -0
- data/tests/models/tc_Auth.rb +34 -0
- data/tests/models/tc_Channel.rb +52 -0
- data/tests/models/tc_Config.rb +19 -0
- data/tests/models/tc_Nick.rb +142 -0
- data/tests/models/tc_NickMode.rb +40 -0
- data/tests/models/tc_Setting.rb +21 -0
- data/tests/models/tc_Signature.rb +14 -0
- data/tests/run_tests.rb +4 -0
- metadata +284 -212
- data/README +0 -36
- data/lib/mod_spox/Cache.rb +0 -57
- data/lib/mod_spox/Monitors.rb +0 -84
- data/lib/mod_spox/Pool.rb +0 -164
- data/lib/mod_spox/models/AuthGroup.rb +0 -16
- data/lib/mod_spox/models/ChannelMode.rb +0 -14
- data/lib/mod_spox/models/NickChannel.rb +0 -45
- data/lib/mod_spox/models/NickGroup.rb +0 -16
|
@@ -7,7 +7,7 @@ class Bullshit < ModSpox::Plugin
|
|
|
7
7
|
include ModSpox::Models
|
|
8
8
|
def initialize(pipeline)
|
|
9
9
|
super(pipeline)
|
|
10
|
-
|
|
10
|
+
add_sig(:sig => 'bullshit', :method => :bullshit, :desc => 'Web economy bullshit generator')
|
|
11
11
|
@bs = [[ "aggregate","architect","benchmark","brand","cultivate","deliver","deploy","disintermediate","drive","e-enable","embrace","empower","enable","engage","engineer","enhance","envisioneer","evolve","expedite","exploit","extend","facilitate","generate","grow","harness","implement","incentivize","incubate","innovate","integrate","iterate","leverage","matrix","maximize","mesh","monetize","morph","optimize","orchestrate","productize","recontextualize","redefine","reintermediate","reinvent","repurpose","revolutionize","scale","seize","strategize","streamline","syndicate","synergize","synthesize","target","transform","transition","unleash","utilize","visualize","whiteboard" ],
|
|
12
12
|
[ "24/365","24/7","B2B","B2C","back-end","best-of-breed","bleeding-edge","bricks-and-clicks","clicks-and-mortar","collaborative","compelling","cross-platform","cross-media","customized","cutting-edge","distributed","dot-com","dynamic","e-business","efficient","end-to-end","enterprise","extensible","frictionless","front-end","global","granular","holistic","impactful","innovative","integrated","interactive","intuitive","killer","leading-edge","magnetic","mission-critical","next-generation","one-to-one","open-source","out-of-the-box","plug-and-play","proactive","real-time","revolutionary","rich","robust","scalable","seamless","sexy","sticky","strategic","synergistic","transparent","turn-key","ubiquitous","user-centric","value-added","vertical","viral","virtual","visionary","web-enabled","wireless","world-class" ],
|
|
13
13
|
[ "action-items","applications","architectures","bandwidth","channels","communities","content","convergence","deliverables","e-business","e-commerce","e-markets","e-services","e-tailers","experiences","eyeballs","functionalities","infomediaries","infrastructures","initiatives","interfaces","markets","methodologies","metrics","mindshare","models","networks","niches","paradigms","partnerships","platforms","portals","relationships","ROI","synergies","web-readiness","schemas","solutions","supply-chains","systems","technologies","users","vortals","web services" ]]
|
|
@@ -2,8 +2,7 @@ class Bytes < ModSpox::Plugin
|
|
|
2
2
|
include Models
|
|
3
3
|
def initialize(args)
|
|
4
4
|
super
|
|
5
|
-
|
|
6
|
-
:description => 'Convert bytes to human readable string').params = [:bytes]
|
|
5
|
+
add_sig(:sig => 'bytes (\d+)', :method => :convert, :desc => 'Convert bytes to human readable string', :params => [:bytes])
|
|
7
6
|
end
|
|
8
7
|
|
|
9
8
|
def convert(message, params)
|
|
@@ -10,12 +10,6 @@ class Confess < ModSpox::Plugin
|
|
|
10
10
|
|
|
11
11
|
def initialize(pipeline)
|
|
12
12
|
super(pipeline)
|
|
13
|
-
begin
|
|
14
|
-
require 'htmlentities'
|
|
15
|
-
rescue Object => boom
|
|
16
|
-
Logger.warn('Error: This plugin requires the HTMLEntities gem. Please install and reload plugin.')
|
|
17
|
-
raise Exceptions::BotException.new("Missing required HTMLEntities library")
|
|
18
|
-
end
|
|
19
13
|
begin
|
|
20
14
|
Confession.db = Sequel.sqlite(BotConfig[:userpath] + '/confessions.db')
|
|
21
15
|
rescue Object => boom
|
|
@@ -23,25 +17,19 @@ class Confess < ModSpox::Plugin
|
|
|
23
17
|
raise Exceptions::BotException.new("Failed to create database: #{boom}")
|
|
24
18
|
end
|
|
25
19
|
Confession.build_confession && Confession.create_table unless Confession.table_exists?
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
Signature.find_or_create(:signature => 'confess count', :plugin => name, :method => 'count',
|
|
35
|
-
:description => 'Current count of cached confessions')
|
|
36
|
-
Signature.find_or_create(:signature => 'confess fetcher (start|stop)', :plugin => name, :method => 'fetcher',
|
|
37
|
-
:description => 'Turn confession fetcher on or off', :group_id => Group.filter(:name => 'admin').first.pk).params = [:status]
|
|
38
|
-
Config[:confess] = 'nofetch' if Config[:confess].nil?
|
|
20
|
+
add_sig(:sig => 'confess', :method => :confess, :desc => 'Print a confession')
|
|
21
|
+
add_sig(:sig => 'confess (?!score|count|fetcher|\+\+|\-\-)(.+)?', :method => :confess, :desc => 'Print a confession', :params => [:term])
|
|
22
|
+
add_sig(:sig => 'confess(\+\+|\-\-) ?(\d+)?', :method => :score, :desc => 'Score a confession', :params => [:score, :id])
|
|
23
|
+
add_sig(:sig => 'confess score (\d+)', :method => :show_score, :desc => 'Show a confession\'s score', :params => [:id])
|
|
24
|
+
add_sig(:sig => 'confess count', :method => :count, :desc => 'Current count of cached confessions')
|
|
25
|
+
add_sig(:sig => 'confess fetcher (start|stop)', :method => :fetcher, :desc => 'Turn confession fetcher on or off', :group => Group.filter(:name => 'admin').first, :params => [:status])
|
|
26
|
+
add_sig(:sig => 'confess count (.+)', :method => :count_matches, :desc => 'Show number entries matching search', :params => [:query])
|
|
27
|
+
Config.set(:confess, 'nofetch') if Config.val(:confess).nil?
|
|
39
28
|
@last_confession = {}
|
|
40
29
|
@fetch = false
|
|
41
|
-
@coder = HTMLEntities.new
|
|
42
30
|
@timer = {:action => nil, :id => nil}
|
|
43
31
|
@lock = Mutex.new
|
|
44
|
-
start_fetcher if Config
|
|
32
|
+
start_fetcher if Config.val(:confess) == 'fetch'
|
|
45
33
|
end
|
|
46
34
|
|
|
47
35
|
def destroy
|
|
@@ -85,6 +73,16 @@ class Confess < ModSpox::Plugin
|
|
|
85
73
|
end
|
|
86
74
|
end
|
|
87
75
|
|
|
76
|
+
def count_matches(m, params)
|
|
77
|
+
begin
|
|
78
|
+
@lock.synchronize do
|
|
79
|
+
reply m.replyto, "Number of matches for \2#{params[:query]}\2: #{Confession.search(params[:query]).size}"
|
|
80
|
+
end
|
|
81
|
+
rescue Object => boom
|
|
82
|
+
error m.replyto, "Failed to count matches. Reason: #{boom}"
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
88
86
|
def show_score(message, params)
|
|
89
87
|
pk = nil
|
|
90
88
|
score = nil
|
|
@@ -115,11 +113,11 @@ class Confess < ModSpox::Plugin
|
|
|
115
113
|
if(c)
|
|
116
114
|
@lock.synchronize do
|
|
117
115
|
if(params[:score] == '++')
|
|
118
|
-
c.
|
|
116
|
+
c.update(:positive => c.positive.to_i + 1)
|
|
119
117
|
else
|
|
120
|
-
c.
|
|
118
|
+
c.update(:negative => c.negative.to_i + 1)
|
|
121
119
|
end
|
|
122
|
-
c.
|
|
120
|
+
c.update(:score => ((c.positive.to_f) / (c.positive.to_f + c.negative.to_f)) * 100.0)
|
|
123
121
|
end
|
|
124
122
|
else
|
|
125
123
|
reply message.replyto, "\2Error:\2 Failed to find confession to score"
|
|
@@ -136,16 +134,16 @@ class Confess < ModSpox::Plugin
|
|
|
136
134
|
|
|
137
135
|
def fetcher(message, params)
|
|
138
136
|
if(params[:status] == 'start')
|
|
139
|
-
if(Config
|
|
137
|
+
if(Config.val(:confess) == 'fetch')
|
|
140
138
|
reply message.replyto, 'Confession fetcher is already running'
|
|
141
139
|
else
|
|
142
|
-
Config
|
|
140
|
+
Config.set(:confess, 'fetch')
|
|
143
141
|
reply message.replyto, 'Confession fetcher is now running'
|
|
144
142
|
start_fetcher
|
|
145
143
|
end
|
|
146
144
|
else
|
|
147
|
-
if(Config
|
|
148
|
-
Config
|
|
145
|
+
if(Config.val(:confess) == 'fetch')
|
|
146
|
+
Config.set(:confess, 'nofetch')
|
|
149
147
|
stop_fetcher
|
|
150
148
|
reply message.replyto, 'Confession fetcher has been stopped'
|
|
151
149
|
else
|
|
@@ -165,7 +163,7 @@ class Confess < ModSpox::Plugin
|
|
|
165
163
|
Logger.info("Match found: #{match[0]}")
|
|
166
164
|
conf = CGI::unescapeHTML(match[0])
|
|
167
165
|
conf = conf.gsub(/<.+?>/, ' ').gsub(/[\r\n]/, '').gsub(/\s+/, ' ')
|
|
168
|
-
conf =
|
|
166
|
+
conf = Helpers.convert_entities(conf)
|
|
169
167
|
Logger.info("Match turned into: #{conf}")
|
|
170
168
|
if conf.length < 300
|
|
171
169
|
begin
|
data/data/mod_spox/extras/DCC.rb
CHANGED
|
@@ -8,30 +8,21 @@ class DCC < ModSpox::Plugin
|
|
|
8
8
|
super
|
|
9
9
|
group = Group.find_or_create(:name => 'dcc')
|
|
10
10
|
admin = Group.find_or_create(:name => 'admin')
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
:description => 'Remove directory from file list', :group_id => admin.pk).params = [:dir]
|
|
21
|
-
Signature.find_or_create(:signature => 'file show dir', :plugin => name, :method => 'show_dirs',
|
|
22
|
-
:description => 'Show directories available to file list', :group_id => admin.pk)
|
|
23
|
-
Signature.find_or_create(:signature => 'file show ports', :plugin => name, :method => 'show_ports',
|
|
24
|
-
:description => 'Show allowed ports', :group_id => admin.pk)
|
|
25
|
-
Signature.find_or_create(:signature => 'file max wait(\s(\d+))?', :plugin => name, :method => 'max_wait',
|
|
26
|
-
:description => 'Show/set timeout for accepting files', :group_id => admin.pk).params = [:wait]
|
|
27
|
-
Signature.find_or_create(:signature => 'dcc chat', :plugin => name, :method => 'dcc_chat',
|
|
28
|
-
:description => 'Start a DCC chat with the bot (useful if behind firewall', :group_id => group.pk)
|
|
11
|
+
add_sig(:sig => 'file list(\s(.+))?', :method => :file_list, :desc => 'List available DCC files', :group => group, :params => [:pattern])
|
|
12
|
+
add_sig(:sig => 'file get (.+)', :method => :file_get, :desc => 'Download file', :group => group, :params => [:filename])
|
|
13
|
+
add_sig(:sig => 'file ports (\d+)-(\d+)', :method => :set_ports, :desc => 'Set allowed DCC ports', :group => admin, :params => [:start, :end])
|
|
14
|
+
add_sig(:sig => 'file adddir (.+)', :method => :add_dir, :desc => 'Add directory to file list', :group => admin, :params => [:dir])
|
|
15
|
+
add_sig(:sig => 'file rmdir (\d+)', :method => :rm_dir, :desc => 'Remove directory from file list', :group => admin, :params => [:dir])
|
|
16
|
+
add_sig(:sig => 'file show dir', :method => :show_dirs, :desc => 'Show directories available to file list', :group => admin)
|
|
17
|
+
add_sig(:sig => 'file show ports', :method => :show_ports, :desc => 'Show allowed ports', :group => admin)
|
|
18
|
+
add_sig(:sig => 'file max wait(\s(\d+))?', :method => :max_wait, :desc => 'Show/set timeout for accepting files', :group => admin, :params => [:wait])
|
|
19
|
+
add_sig(:sig => 'dcc chat', :method => :dcc_chat, :desc => 'Start a DCC chat with the bot (useful if behind firewall', :group => group)
|
|
29
20
|
@servers = {}
|
|
30
|
-
@ports = Setting
|
|
21
|
+
@ports = Setting.val(:dcc_ports)
|
|
31
22
|
@ports = {:start => 49152, :end => 65535} if @ports.nil?
|
|
32
23
|
@dirs = Setting.find_or_create(:name => 'dcc_dirs').value
|
|
33
24
|
@dirs = [] unless @dirs.is_a?(Array)
|
|
34
|
-
@max_wait = Setting
|
|
25
|
+
@max_wait = Setting.val(:dcc_max_wait)
|
|
35
26
|
@max_wait = @max_wait.nil? ? 60 : @max_wait.to_i
|
|
36
27
|
end
|
|
37
28
|
|
|
@@ -8,27 +8,24 @@ class DevWatch < ModSpox::Plugin
|
|
|
8
8
|
def initialize(pipeline)
|
|
9
9
|
super(pipeline)
|
|
10
10
|
admin = Group.filter(:name => 'admin').first
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
:description => 'Set URL for development RSS feed').params = [:url]
|
|
17
|
-
Signature.find_or_create(:signature => 'devwatch interval ?(\d+)?', :plugin => name, :method => 'set_interval', :group_id => admin.pk,
|
|
18
|
-
:description => 'Set time interval for notifications').params = [:time]
|
|
19
|
-
if(Setting[:devwatch].nil?)
|
|
11
|
+
add_sig(:sig => 'devwatch (on|off) (\S+)', :method => :enable_watch, :group => admin, :desc => 'Turn development watcher on/off in given channel', :params => [:status, :channel])
|
|
12
|
+
add_sig(:sig => 'devwatch list', :method => :watch_list, :group => admin, :desc => 'List all channels on the development watch list')
|
|
13
|
+
add_sig(:sig => 'devwatch url ?(\S+)?', :method => :set_url, :group => admin, :desc => 'Set URL for development RSS feed', :params => [:url])
|
|
14
|
+
add_sig(:sig => 'devwatch interval ?(\d+)?', :method => :set_interval, :group => admin, :desc => 'Set time interval for notifications', :params => [:time])
|
|
15
|
+
if(Setting.val(:devwatch).nil?)
|
|
20
16
|
Setting.find_or_create(:name => 'devwatch').value = {:channels => [], :interval => 300}
|
|
21
17
|
end
|
|
22
18
|
@original = nil
|
|
23
19
|
@new = nil
|
|
24
20
|
@timer = {:action => nil, :id => nil}
|
|
25
21
|
start_auto
|
|
22
|
+
check_updates
|
|
26
23
|
end
|
|
27
24
|
|
|
28
25
|
def enable_watch(message, params)
|
|
29
26
|
channel = Channel.filter(:name => params[:channel]).first
|
|
30
27
|
if(channel)
|
|
31
|
-
vals = Setting
|
|
28
|
+
vals = Setting.val(:devwatch)
|
|
32
29
|
if(params[:status] == 'on')
|
|
33
30
|
vals[:channels] << channel.pk unless vals[:channels].include?(channel.pk)
|
|
34
31
|
reply(message.replyto, "#{channel.name} is now on the development watch list")
|
|
@@ -44,25 +41,25 @@ class DevWatch < ModSpox::Plugin
|
|
|
44
41
|
end
|
|
45
42
|
|
|
46
43
|
def watch_list(message, params)
|
|
47
|
-
if(Setting
|
|
44
|
+
if(Setting.val(:devwatch)[:channels].empty?)
|
|
48
45
|
reply(message.replyto, "No channels currently on the development watch list")
|
|
49
46
|
else
|
|
50
47
|
chans = []
|
|
51
|
-
Setting
|
|
48
|
+
Setting.val(:devwatch)[:channels].each{|id| chans << Channel[id].name}
|
|
52
49
|
reply(message.replyto, "Channels on development watch list: #{chans.join(', ')}")
|
|
53
50
|
end
|
|
54
51
|
end
|
|
55
52
|
|
|
56
53
|
def set_url(message, params)
|
|
57
54
|
if(params[:url])
|
|
58
|
-
vals = Setting
|
|
55
|
+
vals = Setting.val(:devwatch)
|
|
59
56
|
vals[:url] = params[:url]
|
|
60
57
|
reply(message.replyto, "OK")
|
|
61
58
|
Setting.filter(:name => 'devwatch').first.value = vals
|
|
62
59
|
update_auto
|
|
63
60
|
else
|
|
64
|
-
if(Setting
|
|
65
|
-
reply(message.replyto, "\2Devwatch URL:\2 #{Setting
|
|
61
|
+
if(Setting.val(:devwatch).has_key?(:url))
|
|
62
|
+
reply(message.replyto, "\2Devwatch URL:\2 #{Setting.val(:devwatch)[:url]}")
|
|
66
63
|
else
|
|
67
64
|
reply(message.replyto, "\2Error:\2 No URL set for devwatch")
|
|
68
65
|
end
|
|
@@ -71,7 +68,7 @@ class DevWatch < ModSpox::Plugin
|
|
|
71
68
|
|
|
72
69
|
def set_interval(message, params)
|
|
73
70
|
if(params[:time])
|
|
74
|
-
vals = Setting
|
|
71
|
+
vals = Setting.val(:devwatch)
|
|
75
72
|
vals[:interval] = params[:time].to_i
|
|
76
73
|
Setting.filter(:name => 'devwatch').first.value = vals
|
|
77
74
|
if(@timer[:action].nil?)
|
|
@@ -81,13 +78,13 @@ class DevWatch < ModSpox::Plugin
|
|
|
81
78
|
end
|
|
82
79
|
reply(message.replyto, "Devwatch announcement interval reset to: #{Helpers.format_seconds(params[:time].to_i)}")
|
|
83
80
|
else
|
|
84
|
-
reply(message.replyto, "Devwatch announcement interval set to: #{Helpers.format_seconds(Setting
|
|
81
|
+
reply(message.replyto, "Devwatch announcement interval set to: #{Helpers.format_seconds(Setting.val(:devwatch)[:interval].to_i)}")
|
|
85
82
|
end
|
|
86
83
|
end
|
|
87
84
|
|
|
88
85
|
def check_updates
|
|
89
|
-
if(Setting
|
|
90
|
-
src = open(Setting
|
|
86
|
+
if(Setting.val(:devwatch).has_key?(:url) && Setting.val(:devwatch)[:channels].size > 0)
|
|
87
|
+
src = open(Setting.val(:devwatch)[:url])
|
|
91
88
|
doc = REXML::Document.new(src.read)
|
|
92
89
|
if @original.nil?
|
|
93
90
|
doc.elements.each('rss/channel/item') do |item|
|
|
@@ -102,7 +99,7 @@ class DevWatch < ModSpox::Plugin
|
|
|
102
99
|
end
|
|
103
100
|
end
|
|
104
101
|
|
|
105
|
-
def print_new
|
|
102
|
+
def print_new(max=5)
|
|
106
103
|
new_items = Array.new
|
|
107
104
|
# run through the list until we hit a duplicate #
|
|
108
105
|
i = 1
|
|
@@ -115,11 +112,12 @@ class DevWatch < ModSpox::Plugin
|
|
|
115
112
|
new_items << "#{item.elements['title'].text}: #{item.elements['link'].text}"
|
|
116
113
|
end
|
|
117
114
|
i += 1
|
|
115
|
+
break if i > max
|
|
118
116
|
end
|
|
119
117
|
@original = new_orig.nil? ? @original : new_orig
|
|
120
118
|
if new_items.size > 0
|
|
121
119
|
new_items.reverse!
|
|
122
|
-
Setting
|
|
120
|
+
Setting.val(:devwatch)[:channels].each do |id|
|
|
123
121
|
channel = Channel[id]
|
|
124
122
|
new_items.each do |item|
|
|
125
123
|
reply(channel, item)
|
|
@@ -143,8 +141,8 @@ class DevWatch < ModSpox::Plugin
|
|
|
143
141
|
end
|
|
144
142
|
|
|
145
143
|
def start_auto
|
|
146
|
-
if(@timer[:action].nil? && Setting
|
|
147
|
-
m = Messages::Internal::TimerAdd.new(self, Setting
|
|
144
|
+
if(@timer[:action].nil? && Setting.val(:devwatch).has_key?(:url) && Setting.val(:devwatch)[:channels].size > 0)
|
|
145
|
+
m = Messages::Internal::TimerAdd.new(self, Setting.val(:devwatch)[:interval].to_i){ check_updates }
|
|
148
146
|
@timer[:id] = m.id
|
|
149
147
|
@pipeline << m
|
|
150
148
|
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# ex: set ts=4 et:
|
|
2
|
+
require "net/http"
|
|
3
|
+
|
|
4
|
+
# downforeveryoneorjustme.com website-upness-checker plugin
|
|
5
|
+
# by pizza
|
|
6
|
+
|
|
7
|
+
class DownForEveryoneOrJustMe < ModSpox::Plugin
|
|
8
|
+
|
|
9
|
+
def initialize(pipeline)
|
|
10
|
+
super
|
|
11
|
+
add_sig(:sig => 'down ((?:(?:[a-z0-9][a-z0-9-]*)\.)+[a-z]+)',
|
|
12
|
+
:method => :down,
|
|
13
|
+
:desc => 'Check website status',
|
|
14
|
+
:params => [:domain])
|
|
15
|
+
@site = 'http://downforeveryoneorjustme.com/'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def down(m, params)
|
|
19
|
+
begin
|
|
20
|
+
# check for valid domain
|
|
21
|
+
domain = params[:domain].downcase
|
|
22
|
+
url = @site + domain
|
|
23
|
+
reply m.replyto, get_text(domain, url)
|
|
24
|
+
rescue Object => boom
|
|
25
|
+
error m.replyto, "Failed to fetch. #{boom}"
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
def get_text(domain, url)
|
|
32
|
+
begin
|
|
33
|
+
t = "#{domain} appears "
|
|
34
|
+
data = Net::HTTP.get_response(URI.parse(url)).body
|
|
35
|
+
if /is up/.match(data)
|
|
36
|
+
t = t + "up"
|
|
37
|
+
else
|
|
38
|
+
t = t + "down"
|
|
39
|
+
end
|
|
40
|
+
return t
|
|
41
|
+
rescue Object => boom
|
|
42
|
+
Logger.error(boom)
|
|
43
|
+
raise boom
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
@@ -4,7 +4,7 @@ class EightBall < ModSpox::Plugin
|
|
|
4
4
|
|
|
5
5
|
def initialize(pipeline)
|
|
6
6
|
super
|
|
7
|
-
|
|
7
|
+
add_sig(:sig => '8ball .+\?$', :method => :eightball, :desc => 'Ask the magic eightball a question')
|
|
8
8
|
@responses = ['Ask Again Later',
|
|
9
9
|
'Better Not Tell You Now',
|
|
10
10
|
'Concentrate and Ask Again',
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require 'net/http'
|
|
2
|
+
require 'rexml/document'
|
|
3
|
+
|
|
4
|
+
class FML < ModSpox::Plugin
|
|
5
|
+
|
|
6
|
+
def initialize(pipeline)
|
|
7
|
+
super
|
|
8
|
+
add_sig(:sig => 'fml( (love|money|kids|work|health|sex|miscellaneous))?', :method => :random, :desc => 'Fuck my life', :params => [:wspace, :category])
|
|
9
|
+
@site = 'http://api.betacie.com/view/'
|
|
10
|
+
@vars = ['key=readonly', 'language=en']
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def random(m, params)
|
|
14
|
+
begin
|
|
15
|
+
t = params[:category] ? "#{params[:category].strip}/" : ''
|
|
16
|
+
reply m.replyto, get_text("#{t}random")
|
|
17
|
+
rescue Object => boom
|
|
18
|
+
error m.replyto, 'Failed to fetch.' + boom.to_s
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def get_text(thing)
|
|
25
|
+
data = Net::HTTP.get_response(URI.parse(@site+thing+'?'+@vars.join('&'))).body
|
|
26
|
+
doc = REXML::Document.new(data)
|
|
27
|
+
output = []
|
|
28
|
+
doc.elements.each('root/items/item/text') do |t|
|
|
29
|
+
output << Helpers.convert_entities(t.text)
|
|
30
|
+
end
|
|
31
|
+
raise 'Failed to fetch item from FML' if output.empty?
|
|
32
|
+
return output[rand(output.size)]
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
@@ -1,26 +1,22 @@
|
|
|
1
1
|
require 'net/http'
|
|
2
2
|
require 'net/https'
|
|
3
|
+
require 'uri'
|
|
3
4
|
|
|
4
5
|
class Headers < ModSpox::Plugin
|
|
5
6
|
|
|
6
7
|
def initialize(pipeline)
|
|
7
8
|
super(pipeline)
|
|
8
9
|
admin = Models::Group.find_or_create(:name => 'headers')
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
:group_id => admin.pk, :description => 'Set maximum number of headers to return').params = [:max]
|
|
13
|
-
Models::Signature.find_or_create(:signature => 'headers max', :plugin => name, :method => 'show_max',
|
|
14
|
-
:group_id => admin.pk, :description => 'Show maximum number of headers to return ')
|
|
10
|
+
add_sig(:sig => 'headers ((https?:\/\/)?\S+)', :method => :fetch_headers, :desc => 'Fetch HTTP headers', :params => [:url])
|
|
11
|
+
add_sig(:sig => 'headers max (\d+)', :method => :set_max, :group => admin, :desc => 'Set maximum number of headers to return', :params => [:max])
|
|
12
|
+
add_sig(:sig => 'headers max', :method => :show_max, :group => admin, :desc => 'Show maximum number of headers to return ')
|
|
15
13
|
@lock = Mutex.new
|
|
16
|
-
@max = Models::Config
|
|
14
|
+
@max = Models::Config.val(:headers_max)
|
|
17
15
|
@max = @max.nil? ? 0 : @max.to_i
|
|
18
16
|
end
|
|
19
17
|
|
|
20
18
|
def set_max(message, params)
|
|
21
|
-
record = Models::Config.
|
|
22
|
-
record.value = params[:max].to_i
|
|
23
|
-
record.save
|
|
19
|
+
record = Models::Config.set(:headers_max, params[:max].to_i)
|
|
24
20
|
@max = params[:max].to_i
|
|
25
21
|
reply message.replyto, "Max headers returned set to: #{params[:max].to_i}"
|
|
26
22
|
end
|
|
@@ -30,48 +26,33 @@ class Headers < ModSpox::Plugin
|
|
|
30
26
|
end
|
|
31
27
|
|
|
32
28
|
def fetch_headers(message, params)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
29
|
+
params[:url] = "http://#{params[:url]}" unless params[:url].slice(0..3).downcase == 'http'
|
|
30
|
+
uri = URI.parse(params[:url])
|
|
31
|
+
begin
|
|
32
|
+
path = uri.path.nil? || uri.path.empty? ? '/' : uri.path
|
|
33
|
+
path += "?#{uri.query}" unless uri.query.nil?
|
|
34
|
+
reply message.replyto, "Connecting to: #{uri.host} on port: #{uri.port} retrieving: #{path}"
|
|
35
|
+
con = Net::HTTP.new(uri.host, uri.port)
|
|
36
|
+
#con.secure = uri.scheme == 'https'
|
|
37
|
+
con.open_timeout = 5
|
|
38
|
+
con.read_timeout = 5
|
|
39
|
+
response = con.head(path)
|
|
40
|
+
output = ["Response code: #{response.code}"]
|
|
41
|
+
count = 0
|
|
42
|
+
response.each_capitalized{|key,val|
|
|
43
|
+
output << "#{key.slice(0..50)}: #{val.slice(0..200)}"
|
|
44
|
+
count += 1
|
|
45
|
+
break if @max != 0 && count >= @max
|
|
46
|
+
}
|
|
47
|
+
if(count >= @max && @max != 0)
|
|
48
|
+
output << 'Maximum header limit reached.'
|
|
37
49
|
else
|
|
38
|
-
|
|
39
|
-
secure = true
|
|
40
|
-
end
|
|
41
|
-
params[:url].gsub!(/^https?:\/\//, '')
|
|
42
|
-
if(params[:url] =~ /:(\d+)/)
|
|
43
|
-
port = $1.to_i
|
|
44
|
-
params[:url].gsub!(/:(\d+)/, '')
|
|
45
|
-
end
|
|
46
|
-
if(params[:url] =~ /(.+?[a-zA-Z]{2,4})(\/.+)$/)
|
|
47
|
-
location = $1
|
|
48
|
-
page = $2
|
|
49
|
-
else
|
|
50
|
-
location = params[:url].gsub(/\/$/, '')
|
|
51
|
-
page = '/'
|
|
52
|
-
end
|
|
53
|
-
begin
|
|
54
|
-
reply message.replyto, "Connecting to: #{location} on port: #{port} retrieving: #{page}"
|
|
55
|
-
con = Net::HTTP.new(location, port)
|
|
56
|
-
con.use_ssl = secure
|
|
57
|
-
response = con.get(page)
|
|
58
|
-
output = ["Response code: #{response.code}"]
|
|
59
|
-
count = 0
|
|
60
|
-
response.each{|key,val|
|
|
61
|
-
output << "#{key.slice(0..50)}: #{val.slice(0..200)}"
|
|
62
|
-
count += 1
|
|
63
|
-
break if @max != 0 && count >= @max
|
|
64
|
-
}
|
|
65
|
-
if(count >= @max && @max != 0)
|
|
66
|
-
output << 'Maximum header limit reached.'
|
|
67
|
-
else
|
|
68
|
-
output << 'Header listing complete'
|
|
69
|
-
end
|
|
70
|
-
reply message.replyto, output
|
|
71
|
-
rescue Object => boom
|
|
72
|
-
reply message.replyto, "Error retrieving headers: #{boom}"
|
|
73
|
-
Logger.warn("#{boom}\n#{boom.backtrace.join("\n")}")
|
|
50
|
+
output << 'Header listing complete'
|
|
74
51
|
end
|
|
52
|
+
reply message.replyto, output
|
|
53
|
+
rescue Object => boom
|
|
54
|
+
reply message.replyto, "Error retrieving headers (#{uri.host}): #{boom}"
|
|
55
|
+
Logger.warn("Headers plugin error: #{boom}")
|
|
75
56
|
end
|
|
76
57
|
end
|
|
77
58
|
|