mod_spox 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -5,10 +5,8 @@ class Talk < ModSpox::Plugin
|
|
5
5
|
def initialize(pipeline)
|
6
6
|
super
|
7
7
|
group = Group.find_or_create(:name => 'talk')
|
8
|
-
|
9
|
-
|
10
|
-
Signature.find_or_create(:signature => 'action (\S+) (.+)', :plugin => name, :method => 'action', :group_id => group.pk,
|
11
|
-
:description => 'Make bot perform action for target', :requirement => 'private').params = [:target, :text]
|
8
|
+
add_sig(:sig => 'say (\S+) (.+)', :method => :talk, :group => group, :desc => 'Make bot speak given text to target', :req => 'private', :params => [:target, :text])
|
9
|
+
add_sig(:sig => 'action (\S+) (.+)', :method => :action, :group => group, :desc => 'Make bot perform action for target', :req => 'private', :params => [:target, :text])
|
12
10
|
end
|
13
11
|
|
14
12
|
def talk(message, params)
|
@@ -5,20 +5,16 @@ class Topten < ModSpox::Plugin
|
|
5
5
|
def initialize(pipeline)
|
6
6
|
super
|
7
7
|
ChatStat.create_table unless ChatStat.table_exists?
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
Signature.find_or_create(:signature => 'stats ?(\S+)?', :plugin => name, :method => 'stats', :description => 'Show stats on nick',
|
13
|
-
:requirement => 'public').params = [:nick]
|
14
|
-
Signature.find_or_create(:signature => 'stats lifetime (\S+)?', :plugin => name, :method => 'life_stats',
|
15
|
-
:description => 'Show stat totals for given nick', :requirement => 'public').params = [:nick]
|
8
|
+
add_sig(:sig => 'topten', :method => :topten, :req => 'public', :desc => 'Show topten users since midnight')
|
9
|
+
add_sig(:sig => 'topten ([0-9]{4}\/[0-9]{2}\/[0-9]{2})', :method => :archive, :desc => 'Show topten from given date', :req => 'public', :params => [:date])
|
10
|
+
add_sig(:sig => 'stats ?(\S+)?', :method => :stats, :desc => 'Show stats on nick', :req => 'public', :params => [:nick])
|
11
|
+
add_sig(:sig => 'stats lifetime (\S+)?', :method => :life_stats, :desc => 'Show stat totals for given nick', :req => 'public', :params => [:nick])
|
16
12
|
@pipeline.hook(self, :log_stats, :Incoming_Privmsg)
|
17
13
|
end
|
18
14
|
|
19
15
|
def topten(m, p)
|
20
16
|
stats = ChatStat.filter(:channel_id => m.target.pk, :daykey => construct_daykey).reverse_order(:bytes).limit(10)
|
21
|
-
if(stats.
|
17
|
+
if(stats.count > 0)
|
22
18
|
users = []
|
23
19
|
stats.each do |stat|
|
24
20
|
bytes = (stat.bytes > 1023) ? "#{sprintf('%.2f', (stat.bytes / 1024.0))}kb" : "#{stat.bytes}b"
|
@@ -32,7 +28,7 @@ class Topten < ModSpox::Plugin
|
|
32
28
|
|
33
29
|
def archive(m, p)
|
34
30
|
stats = ChatStat.filter(:channel_id => m.target.pk, :daykey => p[:date]).reverse_order(:bytes).limit(10)
|
35
|
-
if(stats.
|
31
|
+
if(stats.count > 0)
|
36
32
|
users = []
|
37
33
|
stats.each do |stat|
|
38
34
|
bytes = (stat.bytes > 1023) ? "#{sprintf('%.2f', (stat.bytes / 1024.0))}kb" : "#{stat.bytes}b"
|
@@ -62,8 +58,8 @@ class Topten < ModSpox::Plugin
|
|
62
58
|
def life_stats(m, p)
|
63
59
|
nick = p[:nick] ? Nick.locate(p[:nick], false) : m.source
|
64
60
|
if(nick)
|
65
|
-
result = ChatStat.group(:nick_id).select(
|
66
|
-
bytes = (result[:tbytes] > 1023) ? "#{sprintf('%.2f', (result[:tbytes] / 1024.0))}kb" : "#{result[:tbytes]}b"
|
61
|
+
result = ChatStat.group(:nick_id).select('SUM(bytes) as tbytes'.lit, 'SUM(words) as twords'.lit, 'SUM(questions) as tquestions'.lit).filter(:nick_id => nick.pk).first
|
62
|
+
bytes = (result[:tbytes].to_i > 1023) ? "#{sprintf('%.2f', (result[:tbytes].to_i / 1024.0))}kb" : "#{result[:tbytes]}b"
|
67
63
|
reply m.replyto, "#{nick.nick} (total): #{bytes} logged, #{result[:twords]} words spoken and #{result[:tquestions]} questions asked"
|
68
64
|
else
|
69
65
|
reply m.replyto, "\2Error:\2 Failed to find #{p[:nick]}"
|
@@ -100,6 +96,8 @@ class Topten < ModSpox::Plugin
|
|
100
96
|
foreign_key :channel_id, :table => :channels
|
101
97
|
foreign_key :nick_id, :table => :nicks
|
102
98
|
end
|
99
|
+
many_to_one :channel, :class => ModSpox::Models::Channel
|
100
|
+
many_to_one :nick, :class => ModSpox::Models::Nick
|
103
101
|
end
|
104
102
|
|
105
103
|
end
|
@@ -10,14 +10,12 @@ class TracTicket < ModSpox::Plugin
|
|
10
10
|
add_sig(:sig => 'ticket trac( (\S+))?', :method => :trac_location, :group => admin,
|
11
11
|
:desc => 'Show/set trac site', :params => [:trash, :site])
|
12
12
|
add_sig(:sig => 'ticket site', :method => :trac_location, :desc => 'Show trac site')
|
13
|
-
@site = Config
|
13
|
+
@site = Config.val(:trac)
|
14
14
|
end
|
15
15
|
|
16
16
|
def trac_location(message, params)
|
17
17
|
if(params[:site])
|
18
|
-
site = Config.
|
19
|
-
site.value = params[:site]
|
20
|
-
site.save
|
18
|
+
site = Config.set(:trac, params[:site])
|
21
19
|
@site = params[:site]
|
22
20
|
reply message.replyto, "\2Trac Update:\2 Location of trac system has been updated: #{params[:site]}"
|
23
21
|
else
|
@@ -44,7 +42,7 @@ class TracTicket < ModSpox::Plugin
|
|
44
42
|
'Referer' => @site,
|
45
43
|
'Content-Type' => 'application/x-www-form-urlencoded'
|
46
44
|
}
|
47
|
-
data = "
|
45
|
+
data = "field_reporter=#{URI.escape(message.source.nick)}&field_summary=#{URI.escape(params[:short])}&field_description=#{URI.escape(long)}&field_type=#{URI.escape(params[:type])}&field_status=new&submit=Create%20ticket&field_priority=minor&__FORM_TOKEN=#{URI.escape(fid)}"
|
48
46
|
resp, data = con.post(path, data, headers)
|
49
47
|
reply message.replyto, 'Ticket was successfully added to tracker'
|
50
48
|
rescue Object => boom
|
@@ -4,23 +4,13 @@ class Translate < ModSpox::Plugin
|
|
4
4
|
|
5
5
|
def initialize(pipeline)
|
6
6
|
super(pipeline)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
raise Exceptions::BotException.new("Missing required HTMLEntities library")
|
12
|
-
end
|
13
|
-
Signature.find_or_create(:signature => 'translate ([a-z]{2}\|[a-z]{2}) (.+)', :plugin => name, :method => 'translate',
|
14
|
-
:description => 'Translate text').params = [:lang, :text]
|
15
|
-
Signature.find_or_create(:signature => 'autotranslate add ([a-z]{2}) (\S+)', :plugin => name, :method => 'auto_add',
|
16
|
-
:description => 'Add a nick to the autotranslate service').params = [:lang, :nick]
|
17
|
-
Signature.find_or_create(:signature => 'autotranslate remove (\S+)', :plugin => name, :method => 'auto_remove',
|
18
|
-
:description => 'Remove a nick from the autotranslate service').params = [:nick]
|
19
|
-
add_sig(:sig => 'translate languages', :method => 'langs', :description => 'Show available languages')
|
7
|
+
add_sig(:sig => 'translate ([a-z]{2}\|[a-z]{2}) (.+)', :method => :translate, :desc => 'Translate text', :params => [:lang, :text])
|
8
|
+
add_sig(:sig => 'autotranslate add ([a-z]{2}) (\S+)', :method => :auto_add, :desc => 'Add a nick to the autotranslate service', :params => [:lang, :nick])
|
9
|
+
add_sig(:sig => 'autotranslate remove (\S+)', :method => :auto_remove, :desc => 'Remove a nick from the autotranslate service', :params => [:nick])
|
10
|
+
add_sig(:sig => 'translate languages', :method => :langs, :desc => 'Show available languages')
|
20
11
|
@pipeline.hook(self, :listener, :Incoming_Privmsg)
|
21
12
|
@watchers = {}
|
22
13
|
@cache = {}
|
23
|
-
@coder = HTMLEntities.new
|
24
14
|
@allowed = {'zh'=>'Chinese-simplified','zt'=>'Chinese-traditional','en'=>'English','nl'=>'Dutch',
|
25
15
|
'fr'=>'French','de'=>'German','el'=>'Greek','it'=>'Italian','ja'=>'Japanese',
|
26
16
|
'ko'=>'Korean','pt'=>'Portuguese','ru'=>'Russian','es'=>'Spanish'}
|
@@ -82,12 +72,13 @@ class Translate < ModSpox::Plugin
|
|
82
72
|
def listener(message)
|
83
73
|
if(message.is_public? && @watchers.has_key?(message.target.pk))
|
84
74
|
if(@watchers[message.target.pk].has_key?(message.source.pk))
|
85
|
-
trans_message = do_translation("#{@watchers[message.target.pk][message.source.pk]}en", message.message)
|
75
|
+
trans_message = do_translation("#{@watchers[message.target.pk][message.source.pk]}|en", message.message)
|
86
76
|
reply message.replyto, "\2Translation (#{message.source.nick}):\2 #{trans_message}" unless trans_message == message.message
|
87
|
-
elsif(message.message =~ /^(\S+
|
77
|
+
elsif(message.message =~ /^(\S+[:, ])/)
|
78
|
+
message.message.slice!(0..$1.size)
|
88
79
|
Logger.info("Translate matched a followed nick: #{$1}")
|
89
80
|
nick = Helpers.find_model($1, false)
|
90
|
-
return unless nick
|
81
|
+
return unless nick.is_a?(Models::Nick)
|
91
82
|
if(@watchers[message.target.pk].has_key?(nick.pk))
|
92
83
|
reply message.replyto, "\2(#{do_translation("en|#{@watchers[message.target.pk][nick.pk]}", 'translation')})\2 #{do_translation("en|#{@watchers[message.target.pk][nick.pk]}", message.message)}"
|
93
84
|
end
|
@@ -102,17 +93,24 @@ class Translate < ModSpox::Plugin
|
|
102
93
|
if(@cache.has_key?(langs) && @cache[langs].has_key?(text))
|
103
94
|
return @cache[langs][text]
|
104
95
|
end
|
105
|
-
|
96
|
+
headers = {'Accept-Charset' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7'}
|
97
|
+
url = URI.parse('http://babelfish.yahoo.com/translate_txt')
|
98
|
+
post = Net::HTTP::Post.new(url.path, headers)
|
99
|
+
post.set_form_data({
|
106
100
|
'ei' => 'UTF-8',
|
107
101
|
'doit' => 'done',
|
108
|
-
'fr' => 'bf-
|
102
|
+
'fr' => 'bf-res',
|
109
103
|
'intl' => '1',
|
110
104
|
'tt' => 'urltext',
|
111
105
|
'trtext' => text,
|
112
106
|
'lp' => langs.gsub(/\|/, '_'),
|
113
107
|
'btnTrTxt' => 'Translate'
|
114
|
-
})
|
115
|
-
|
108
|
+
})
|
109
|
+
result = Net::HTTP.new(url.host, url.port).start do |http|
|
110
|
+
http.request(post)
|
111
|
+
end
|
112
|
+
if(result.is_a?(Net::HTTPSuccess))
|
113
|
+
content = result.body
|
116
114
|
if(content =~ /<div id="result">(.+?)<input/im)
|
117
115
|
tr = $1
|
118
116
|
tr.gsub!(/<.+?>/, '')
|
@@ -122,7 +120,7 @@ class Translate < ModSpox::Plugin
|
|
122
120
|
@cache[langs] = {} unless @cache.has_key?(langs)
|
123
121
|
@cache[langs][text] = tr
|
124
122
|
end
|
125
|
-
return
|
123
|
+
return Helpers.convert_entities(tr).strip
|
126
124
|
else
|
127
125
|
raise 'Failed to locate translation'
|
128
126
|
end
|
@@ -34,7 +34,7 @@ class Twitter < ModSpox::Plugin
|
|
34
34
|
ModClient.configure do |conf|
|
35
35
|
conf.user_agent = 'mod_spox twitter for twits'
|
36
36
|
conf.application_name = 'mod_spox IRC bot'
|
37
|
-
conf.application_version = "#{
|
37
|
+
conf.application_version = "#{ModSpox.botversion} (#{ModSpox.botcodename})"
|
38
38
|
conf.application_url = 'http://rubyforge.org/projects/mod_spox'
|
39
39
|
conf.source = 'modspoxircbot'
|
40
40
|
end
|
@@ -64,11 +64,19 @@ class Twitter < ModSpox::Plugin
|
|
64
64
|
:group => admin, :req => 'public')
|
65
65
|
add_sig(:sig => 'autotweets interval( \d+)?', :method => :auto_tweets_interval, :desc => 'Set/show interval for auto tweet checks',
|
66
66
|
:group => admin, :params => [:interval])
|
67
|
+
add_sig(:sig => 'autotweets burst( \d+)?', :method => :auto_tweets_burst, :desc => 'Set/show maximum number of tweets to display at once',
|
68
|
+
:group => admin, :params => [:burst])
|
69
|
+
add_sig(:sig => 'twitter alias (\S+) (\S+)', :method => :alias_user, :desc => 'Set alias for twitter account', :group => twitter, :params => [:twit, :irc])
|
70
|
+
add_sig(:sig => 'twitter aliases (\S+)', :method => :show_aliases, :desc => 'Show alias for twit', :params => [:twit])
|
71
|
+
add_sig(:sig => 'twitter dealias (\S+)', :method => :remove_alias, :desc => 'Remove alias for twit', :params => [:twit], :group => twitter)
|
67
72
|
@pipeline.hook(self, :get_timer, :Internal_TimerResponse)
|
68
73
|
@auth_info = Models::Setting.find_or_create(:name => 'twitter').value
|
69
74
|
@twitter = ModClient.new
|
70
|
-
@coder = HTMLEntities.new
|
71
75
|
@search_url = 'http://search.twitter.com/search.json'
|
76
|
+
@aliases = Models::Setting.find_or_create(:name => 'twitter_aliases').value
|
77
|
+
@aliases = {} if @aliases.nil?
|
78
|
+
@burst = Models::Setting.find_or_create(:name => 'twitter_burst').value
|
79
|
+
@burst = @burst.nil? ? 5 : @burst.to_i
|
72
80
|
unless(@auth_info.is_a?(Hash))
|
73
81
|
@auth_info = {:username => nil, :password => nil, :interval => 0, :channels => []}
|
74
82
|
else
|
@@ -78,8 +86,64 @@ class Twitter < ModSpox::Plugin
|
|
78
86
|
@lock = Mutex.new
|
79
87
|
@running = false
|
80
88
|
@timer = {:action => nil, :id => nil}
|
89
|
+
@friends = []
|
90
|
+
populate_friends
|
81
91
|
start_auto
|
82
92
|
end
|
93
|
+
|
94
|
+
def auto_tweets_burst(m, params)
|
95
|
+
if(params[:burst])
|
96
|
+
params[:burst] = params[:burst].to_i
|
97
|
+
if(params[:burst] == 0)
|
98
|
+
error m.replyto, 'Invalid value. Must supply a positive integer.'
|
99
|
+
else
|
100
|
+
@burst = params[:burst]
|
101
|
+
information m.replyto, "Updated maximum autotweet burst to: #{@burst}"
|
102
|
+
end
|
103
|
+
else
|
104
|
+
information m.replyto, "Maximum number of tweets to auto report: #{@burst}"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def alias_user(m, params)
|
109
|
+
begin
|
110
|
+
raise "twit #{params[:twit]} is not in my friends list" unless @friends.include?(params[:twit])
|
111
|
+
raise "twit is already aliased to #{Models::Nick[@aliases[params[:twit].to_sym]].nick}" if @aliases.has_key?(params[:twit].to_sym)
|
112
|
+
nick = Helpers.find_model(params[:irc])
|
113
|
+
raise "failed to find nick #{params[:irc]}. is this a new user?" if nick.nil?
|
114
|
+
@aliases[params[:twit].to_sym] = nick.pk
|
115
|
+
save_aliases
|
116
|
+
information m.replyto, "Nick #{params[:irc]} is now aliased to twit #{params[:twit]}"
|
117
|
+
rescue Object => boom
|
118
|
+
error m.replyto, "Failed to alias user: #{boom}"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def save_aliases
|
123
|
+
t = Models::Setting.find_or_create(:name => 'twitter_aliases')
|
124
|
+
t.value = @aliases
|
125
|
+
t.save
|
126
|
+
end
|
127
|
+
|
128
|
+
def show_aliases(m, params)
|
129
|
+
begin
|
130
|
+
raise "twit #{params[:twit]} has no alias" unless @aliases.has_key?(params[:twit].to_sym)
|
131
|
+
information m.replyto, "Twit #{params[:twit]} is aliased to: #{Models::Nick[@aliases[params[:twit].to_sym]].nick}"
|
132
|
+
rescue Object => boom
|
133
|
+
error m.replyto, "Failed to find alias. Reason: #{boom}"
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def remove_alias(m, params)
|
138
|
+
begin
|
139
|
+
raise "twit #{params[:twit]} has no alias" unless @aliases.has_key?(params[:twit].to_sym)
|
140
|
+
@aliases.delete(params[:twit].to_sym)
|
141
|
+
save_aliases
|
142
|
+
information m.replyto, "Twit #{params[:twit]} is no longer aliased"
|
143
|
+
rescue Object => boom
|
144
|
+
error m.replyto, "Failed to remove alias: #{boom}"
|
145
|
+
end
|
146
|
+
end
|
83
147
|
|
84
148
|
def search(m, params)
|
85
149
|
url = URI.escape("#{@search_url}?rpp=1&q=#{params[:term]}")
|
@@ -109,7 +173,10 @@ class Twitter < ModSpox::Plugin
|
|
109
173
|
output = ["Twitter match for: \2#{term}:\2"]
|
110
174
|
result['results'].each do |item|
|
111
175
|
t = Time.parse(item['created_at'])
|
112
|
-
output << "[#{t.strftime("%Y/%m/%d-%H:%M:%S")}] <#{item['from_user']}> #{item['text']}"
|
176
|
+
output << "[#{t.strftime("%Y/%m/%d-%H:%M:%S")}] <#{item['from_user']}> #{Helpers.convert_entities(item['text'])}"
|
177
|
+
end
|
178
|
+
if(output.size < 2)
|
179
|
+
output = "\2Error:\2 No results found for term: #{term}"
|
113
180
|
end
|
114
181
|
return output
|
115
182
|
rescue Object => boom
|
@@ -121,7 +188,7 @@ class Twitter < ModSpox::Plugin
|
|
121
188
|
msgs = @twitter.messages(:received)
|
122
189
|
reply m.replyto, "\2Twitter INBOX\2 Messages in inbox: #{msgs.size} (only last 5 displayed)"
|
123
190
|
msgs.slice(0..5).each do | msg |
|
124
|
-
reply m.replyto, "\2#{msg.sender.screen_name}:\2 [#{msg.id}] #{
|
191
|
+
reply m.replyto, "\2#{msg.sender.screen_name}:\2 [#{msg.id}] #{Helpers.convert_entities(msg.text)}"
|
125
192
|
end
|
126
193
|
end
|
127
194
|
|
@@ -239,15 +306,10 @@ class Twitter < ModSpox::Plugin
|
|
239
306
|
end
|
240
307
|
|
241
308
|
def friends(m, params)
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
else
|
247
|
-
warning m.replyto, 'no friends found'
|
248
|
-
end
|
249
|
-
rescue Object => boom
|
250
|
-
error m.replyto, "failed to locate friends list. (#{boom})"
|
309
|
+
if(@friends.size > 0)
|
310
|
+
reply m.replyto, "\2Friends:\2 #{@friends.join(', ')}"
|
311
|
+
else
|
312
|
+
warning m.replyto, 'no friends found'
|
251
313
|
end
|
252
314
|
end
|
253
315
|
|
@@ -257,6 +319,7 @@ class Twitter < ModSpox::Plugin
|
|
257
319
|
unless(@twitter.my(:friends).include?(user))
|
258
320
|
@twitter.friend(:add, user)
|
259
321
|
information m.replyto, "added new friend: #{params[:twit]}"
|
322
|
+
@friends << params[:twit]
|
260
323
|
else
|
261
324
|
warning m.replyto, "#{params[:twit]} is already in friend list"
|
262
325
|
end
|
@@ -271,6 +334,7 @@ class Twitter < ModSpox::Plugin
|
|
271
334
|
if(@twitter.my(:friends).map{|u|u.screen_name}.include?(user.screen_name))
|
272
335
|
@twitter.friend(:remove, user)
|
273
336
|
information m.replyto, "removed user from friend list: #{params[:twit]}"
|
337
|
+
@friends.delete(params[:twit])
|
274
338
|
else
|
275
339
|
warning m.replyto, "#{params[:twit]} is not in friend list"
|
276
340
|
end
|
@@ -283,7 +347,7 @@ class Twitter < ModSpox::Plugin
|
|
283
347
|
begin
|
284
348
|
msg = @twitter.status(:get, params[:m_id])
|
285
349
|
if(msg)
|
286
|
-
reply m.replyto, "\2Tweet:\2 [#{msg.created_at.strftime("%Y/%m/%d-%H:%M:%S")}
|
350
|
+
reply m.replyto, "\2Tweet:\2 [#{msg.created_at.strftime("%Y/%m/%d-%H:%M:%S")}] <#{screen_name(msg.user.screen_name)}> #{Helpers.convert_entities(msg.text)}"
|
287
351
|
else
|
288
352
|
warning m.replyto, "failed to find message with ID: #{params[:m_id].strip}"
|
289
353
|
end
|
@@ -294,6 +358,34 @@ class Twitter < ModSpox::Plugin
|
|
294
358
|
|
295
359
|
private
|
296
360
|
|
361
|
+
def populate_friends
|
362
|
+
return unless @lock.try_lock
|
363
|
+
begin
|
364
|
+
fs = @twitter.my(:friends)
|
365
|
+
@friends = []
|
366
|
+
if(fs.size > 0)
|
367
|
+
@friends = fs.map{|u| u.screen_name}
|
368
|
+
end
|
369
|
+
rescue Object => boom
|
370
|
+
Logger.info("Failed to populate friends: #{boom}")
|
371
|
+
@pipeline << Messages::Internal::TimerAdd.new(self, 200, nil, true){ populate_friends }
|
372
|
+
ensure
|
373
|
+
@lock.unlock
|
374
|
+
end
|
375
|
+
end
|
376
|
+
|
377
|
+
def screen_name(n)
|
378
|
+
return @aliases.has_key?(n.to_sym) ? Models::Nick[@aliases[n.to_sym]].nick : n
|
379
|
+
end
|
380
|
+
|
381
|
+
def replace_names(s)
|
382
|
+
s.scan(/@\S+/).each do |n|
|
383
|
+
n.slice!(0)
|
384
|
+
s.gsub!("@#{n}", "@#{screen_name(n)}")
|
385
|
+
end
|
386
|
+
return s
|
387
|
+
end
|
388
|
+
|
297
389
|
def check_timeline
|
298
390
|
if(@auth_info[:channels].size < 1 || @auth_info[:interval].to_i < 1)
|
299
391
|
Logger.warn('Twitter has no channels to send information to')
|
@@ -302,19 +394,24 @@ class Twitter < ModSpox::Plugin
|
|
302
394
|
things = []
|
303
395
|
@twitter.my(:friends).each do |f|
|
304
396
|
@twitter.timeline_for(:friend, :id => f.screen_name, :since => @last_check) do |status|
|
305
|
-
if
|
397
|
+
next if status.created_at < @last_check
|
398
|
+
if(Helpers.convert_entities(status.text) =~ /^@(\S+)/)
|
306
399
|
next unless @twitter.my(:friends).map{|f|f.screen_name}.include?($1) || $1 == @twitter.login
|
307
400
|
end
|
308
|
-
things << "[#{status.created_at.strftime("%H:%M:%S")}] <#{status.user.screen_name}> #{
|
401
|
+
things << "[#{status.created_at.strftime("%H:%M:%S")}] <#{screen_name(status.user.screen_name)}> #{Helpers.convert_entities(replace_names(status.text))}"
|
309
402
|
end
|
310
403
|
end
|
311
404
|
@twitter.timeline_for(:me, :since => @last_check) do |status|
|
312
|
-
|
405
|
+
next if status.created_at < @last_check
|
406
|
+
things << "[#{status.created_at.strftime("%H:%M:%S")}] <#{screen_name(status.user.screen_name)}> #{Helpers.convert_entities(replace_names(status.text))}"
|
313
407
|
end
|
314
|
-
things.
|
315
|
-
|
316
|
-
|
317
|
-
|
408
|
+
unless(things.empty?)
|
409
|
+
things.uniq!
|
410
|
+
things.sort!
|
411
|
+
things = things[-@burst,@burst] if things.size > @burst
|
412
|
+
things.each do |status|
|
413
|
+
@auth_info[:channels].each{|i| reply Models::Channel[i], "\2AutoTweet:\2 #{status}"}
|
414
|
+
end
|
318
415
|
end
|
319
416
|
@last_check = Time.now
|
320
417
|
rescue Object => boom
|
@@ -323,18 +420,6 @@ class Twitter < ModSpox::Plugin
|
|
323
420
|
end
|
324
421
|
end
|
325
422
|
|
326
|
-
def information(to, message)
|
327
|
-
reply to, "\2Twitter (info):\2 #{message}"
|
328
|
-
end
|
329
|
-
|
330
|
-
def warning(to, message)
|
331
|
-
reply to, "\2Twitter (warn):\2 #{message}"
|
332
|
-
end
|
333
|
-
|
334
|
-
def error(to, message)
|
335
|
-
reply to, "\2Twitter (error):\2 #{message}"
|
336
|
-
end
|
337
|
-
|
338
423
|
def save_info
|
339
424
|
i = Models::Setting.find_or_create(:name => 'twitter')
|
340
425
|
i.value = @auth_info
|
@@ -7,21 +7,12 @@ class UrbanDictionary < ModSpox::Plugin
|
|
7
7
|
|
8
8
|
def initialize(pipeline)
|
9
9
|
super(pipeline)
|
10
|
-
|
11
|
-
|
12
|
-
rescue Object => boom
|
13
|
-
Logger.warn('Error: This plugin requires the HTMLEntities gem. Please install and reload plugin.')
|
14
|
-
raise Exceptions::BotException.new("Missing required HTMLEntities library")
|
15
|
-
end
|
16
|
-
Signature.find_or_create(:signature => 'udefine (?!key)(\d+)? ?(.+)', :plugin => name, :method => 'define',
|
17
|
-
:description => 'Find the definition of a word or phrase').params = [:number, :term]
|
18
|
-
Signature.find_or_create(:signature => 'udefine key (.+)', :plugin => name, :method => 'key',
|
19
|
-
:group_id => Models::Group.filter(:name => 'admin').first.pk, :description => 'Set API key').params = [:key]
|
20
|
-
@coder = HTMLEntities.new
|
10
|
+
add_sig(:sig => 'udefine (?!key)((\d+ )?(.+))', :method => :define, :desc => 'Find the definition of a word or phrase', :params => [:fullmatch, :number, :term])
|
11
|
+
add_sig(:sig => 'udefine key (.+)', :method => :key, :group => Models::Group.filter(:name => 'admin').first, :desc => 'Set API key', :params => [:key])
|
21
12
|
end
|
22
13
|
|
23
14
|
def define(message, params)
|
24
|
-
key = Config
|
15
|
+
key = Config.val(:urban_key)
|
25
16
|
if(key)
|
26
17
|
site = 'http://api.urbandictionary.com/soap?wsdl'
|
27
18
|
result = params[:number] ? params[:number].to_i - 1 : 0
|
@@ -35,11 +26,11 @@ class UrbanDictionary < ModSpox::Plugin
|
|
35
26
|
if defs.size < result + 1
|
36
27
|
@pipeline << Privmsg.new(message.replyto, "Error: Definition number #{result+1} for term: #{params[:term]} not found.")
|
37
28
|
else
|
38
|
-
defin = defs[result].definition.length >
|
39
|
-
exp = defs[result].example.length >
|
29
|
+
defin = defs[result].definition.length > 390 ? defs[result].definition.slice(0..390) + " *[CUT]*" : defs[result].definition
|
30
|
+
exp = defs[result].example.length > 390 ? defs[result].example.slice(0..390) + " *[CUT]*" : defs[result].example
|
40
31
|
output << "Definition for \2#{defs[result].word}:\2"
|
41
|
-
output <<
|
42
|
-
output << "\2Example usage:\2 #{
|
32
|
+
output << Helpers.convert_entities(defin.gsub(/[\r\n\s]+/, ' '))
|
33
|
+
output << "\2Example usage:\2 #{Helpers.convert_entities(exp.gsub(/[\r\n\s]+/, ' '))}" if exp.length > 0
|
43
34
|
reply message.replyto, output
|
44
35
|
end
|
45
36
|
rescue Timeout::Error
|
@@ -56,7 +47,7 @@ class UrbanDictionary < ModSpox::Plugin
|
|
56
47
|
if(message.is_public?)
|
57
48
|
@pipeline << Privmsg.new(message.replyto, 'I don\'t set keys in public')
|
58
49
|
else
|
59
|
-
Config
|
50
|
+
Config.set(:urban_key, params[:key])
|
60
51
|
@pipeline << Privmsg.new(message.replyto, 'Urban Dictionary API key has been set.')
|
61
52
|
end
|
62
53
|
end
|