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.
Files changed (145) hide show
  1. data/CHANGELOG +31 -1
  2. data/LICENSE +674 -0
  3. data/README.rdoc +73 -0
  4. data/bin/mod_spox +28 -28
  5. data/data/mod_spox/extras/AOLSpeak.rb +2 -3
  6. data/data/mod_spox/extras/AutoKick.rb +10 -23
  7. data/data/mod_spox/extras/AutoMode.rb +12 -23
  8. data/data/mod_spox/extras/Bash.rb +55 -0
  9. data/data/mod_spox/extras/Bouncer.rb +85 -57
  10. data/data/mod_spox/extras/Bullshit.rb +1 -1
  11. data/data/mod_spox/extras/Bytes.rb +1 -2
  12. data/data/mod_spox/extras/Confess.rb +27 -29
  13. data/data/mod_spox/extras/DCC.rb +11 -20
  14. data/data/mod_spox/extras/DevWatch.rb +21 -23
  15. data/data/mod_spox/extras/DownForEveryoneOrJustMe.rb +47 -0
  16. data/data/mod_spox/extras/EightBall.rb +1 -1
  17. data/data/mod_spox/extras/FML.rb +35 -0
  18. data/data/mod_spox/extras/Headers.rb +31 -50
  19. data/data/mod_spox/extras/Karma.rb +81 -29
  20. data/data/mod_spox/extras/Logger.rb +2 -2
  21. data/data/mod_spox/extras/LolSpeak.rb +1 -2
  22. data/data/mod_spox/extras/PhpCli.rb +138 -8
  23. data/data/mod_spox/extras/PhpFuncLookup.rb +20 -23
  24. data/data/mod_spox/extras/Pinger.rb +1 -1
  25. data/data/mod_spox/extras/Quotes.rb +8 -10
  26. data/data/mod_spox/extras/RegexTracker.rb +2 -4
  27. data/data/mod_spox/extras/Roulette.rb +20 -27
  28. data/data/mod_spox/extras/RubyCli.rb +93 -0
  29. data/data/mod_spox/extras/Search.rb +17 -3
  30. data/data/mod_spox/extras/Seen.rb +150 -0
  31. data/data/mod_spox/extras/SlashdotHeadlineGenerator.rb +500 -0
  32. data/data/mod_spox/extras/Talk.rb +2 -4
  33. data/data/mod_spox/extras/Topten.rb +10 -12
  34. data/data/mod_spox/extras/TracTicket.rb +3 -5
  35. data/data/mod_spox/extras/Translate.rb +20 -22
  36. data/data/mod_spox/extras/Twitter.rb +118 -33
  37. data/data/mod_spox/extras/UrbanDictionary.rb +8 -17
  38. data/data/mod_spox/extras/Weather.rb +1 -2
  39. data/data/mod_spox/plugins/Authenticator.rb +93 -98
  40. data/data/mod_spox/plugins/Banner.rb +26 -56
  41. data/data/mod_spox/plugins/Helper.rb +5 -6
  42. data/data/mod_spox/plugins/Initializer.rb +4 -14
  43. data/data/mod_spox/plugins/Joiner.rb +1 -1
  44. data/data/mod_spox/plugins/Nicker.rb +13 -0
  45. data/data/mod_spox/plugins/Parter.rb +2 -2
  46. data/data/mod_spox/plugins/Permissions.rb +60 -0
  47. data/data/mod_spox/plugins/PluginLoader.rb +7 -12
  48. data/data/mod_spox/plugins/Ponger.rb +51 -0
  49. data/data/mod_spox/plugins/Quitter.rb +1 -2
  50. data/data/mod_spox/plugins/Servers.rb +57 -0
  51. data/data/mod_spox/plugins/Status.rb +3 -2
  52. data/data/mod_spox/plugins/Triggers.rb +9 -9
  53. data/lib/mod_spox/Bot.rb +109 -33
  54. data/lib/mod_spox/BotConfig.rb +2 -2
  55. data/lib/mod_spox/ConfigurationWizard.rb +12 -12
  56. data/lib/mod_spox/Database.rb +1 -4
  57. data/lib/mod_spox/Exceptions.rb +26 -0
  58. data/lib/mod_spox/Helpers.rb +29 -68
  59. data/lib/mod_spox/Loader.rb +23 -24
  60. data/lib/mod_spox/Logger.rb +19 -17
  61. data/lib/mod_spox/MessageFactory.rb +50 -24
  62. data/lib/mod_spox/Pipeline.rb +21 -7
  63. data/lib/mod_spox/Plugin.rb +27 -3
  64. data/lib/mod_spox/PluginManager.rb +28 -15
  65. data/lib/mod_spox/PriorityQueue.rb +69 -0
  66. data/lib/mod_spox/Socket.rb +93 -51
  67. data/lib/mod_spox/Sockets.rb +76 -63
  68. data/lib/mod_spox/Timer.rb +21 -141
  69. data/lib/mod_spox/Version.rb +14 -0
  70. data/lib/mod_spox/handlers/BadNick.rb +1 -1
  71. data/lib/mod_spox/handlers/Bounce.rb +5 -5
  72. data/lib/mod_spox/handlers/Created.rb +13 -5
  73. data/lib/mod_spox/handlers/Handler.rb +12 -3
  74. data/lib/mod_spox/handlers/Invite.rb +14 -8
  75. data/lib/mod_spox/handlers/Join.rb +24 -20
  76. data/lib/mod_spox/handlers/Kick.rb +22 -13
  77. data/lib/mod_spox/handlers/Mode.rb +42 -36
  78. data/lib/mod_spox/handlers/Motd.rb +4 -0
  79. data/lib/mod_spox/handlers/Names.rb +66 -39
  80. data/lib/mod_spox/handlers/Nick.rb +20 -14
  81. data/lib/mod_spox/handlers/Part.rb +25 -8
  82. data/lib/mod_spox/handlers/Ping.rb +11 -5
  83. data/lib/mod_spox/handlers/Pong.rb +9 -5
  84. data/lib/mod_spox/handlers/Privmsg.rb +25 -17
  85. data/lib/mod_spox/handlers/Quit.rb +13 -8
  86. data/lib/mod_spox/handlers/Topic.rb +4 -0
  87. data/lib/mod_spox/handlers/Welcome.rb +16 -24
  88. data/lib/mod_spox/handlers/Who.rb +64 -48
  89. data/lib/mod_spox/handlers/Whois.rb +92 -60
  90. data/lib/mod_spox/messages/incoming/Nick.rb +2 -2
  91. data/lib/mod_spox/messages/incoming/Privmsg.rb +1 -1
  92. data/lib/mod_spox/messages/incoming/Whois.rb +1 -0
  93. data/lib/mod_spox/messages/internal/EstablishConnection.rb +1 -1
  94. data/lib/mod_spox/messages/internal/PluginsReady.rb +10 -0
  95. data/lib/mod_spox/messages/internal/QueueSocket.rb +8 -0
  96. data/lib/mod_spox/messages/internal/Reconnect.rb +8 -0
  97. data/lib/mod_spox/messages/internal/UnqueueSocket.rb +8 -0
  98. data/lib/mod_spox/migrations/002_persistent_sigs.rb +14 -0
  99. data/lib/mod_spox/migrations/003_auth_restructure.rb +31 -0
  100. data/lib/mod_spox/migrations/004_mode_index_fix.rb +18 -0
  101. data/lib/mod_spox/migrations/005_nick_mode_nopark.rb +18 -0
  102. data/lib/mod_spox/models/Auth.rb +16 -46
  103. data/lib/mod_spox/models/AuthMask.rb +13 -0
  104. data/lib/mod_spox/models/Channel.rb +46 -27
  105. data/lib/mod_spox/models/Config.rb +10 -19
  106. data/lib/mod_spox/models/Group.rb +20 -8
  107. data/lib/mod_spox/models/Models.rb +1 -1
  108. data/lib/mod_spox/models/Nick.rb +105 -113
  109. data/lib/mod_spox/models/NickMode.rb +23 -9
  110. data/lib/mod_spox/models/Server.rb +12 -1
  111. data/lib/mod_spox/models/Setting.rb +12 -16
  112. data/lib/mod_spox/models/Signature.rb +28 -8
  113. data/tests/BotHolder.rb +24 -0
  114. data/tests/handlers/tc_BadNick.rb +21 -0
  115. data/tests/handlers/tc_Created.rb +24 -0
  116. data/tests/handlers/tc_Invite.rb +50 -0
  117. data/tests/handlers/tc_Join.rb +33 -0
  118. data/tests/handlers/tc_Kick.rb +32 -0
  119. data/tests/handlers/tc_Mode.rb +85 -0
  120. data/tests/handlers/tc_Names.rb +35 -0
  121. data/tests/handlers/tc_Nick.rb +55 -0
  122. data/tests/handlers/tc_Part.rb +44 -0
  123. data/tests/handlers/tc_Ping.rb +40 -0
  124. data/tests/handlers/tc_Pong.rb +28 -0
  125. data/tests/handlers/tc_Privmsg.rb +85 -0
  126. data/tests/handlers/tc_Quit.rb +40 -0
  127. data/tests/handlers/tc_Who.rb +50 -0
  128. data/tests/handlers/tc_Whois.rb +61 -0
  129. data/tests/models/tc_Auth.rb +34 -0
  130. data/tests/models/tc_Channel.rb +52 -0
  131. data/tests/models/tc_Config.rb +19 -0
  132. data/tests/models/tc_Nick.rb +142 -0
  133. data/tests/models/tc_NickMode.rb +40 -0
  134. data/tests/models/tc_Setting.rb +21 -0
  135. data/tests/models/tc_Signature.rb +14 -0
  136. data/tests/run_tests.rb +4 -0
  137. metadata +284 -212
  138. data/README +0 -36
  139. data/lib/mod_spox/Cache.rb +0 -57
  140. data/lib/mod_spox/Monitors.rb +0 -84
  141. data/lib/mod_spox/Pool.rb +0 -164
  142. data/lib/mod_spox/models/AuthGroup.rb +0 -16
  143. data/lib/mod_spox/models/ChannelMode.rb +0 -14
  144. data/lib/mod_spox/models/NickChannel.rb +0 -45
  145. data/lib/mod_spox/models/NickGroup.rb +0 -16
data/README DELETED
@@ -1,36 +0,0 @@
1
- mod_spox
2
- http://modspox.rubyforge.org
3
- Author: spox
4
-
5
- == Description
6
-
7
- A Ruby IRC bot
8
-
9
- == Usage
10
-
11
- Configuration:
12
-
13
- mod_spox --config
14
-
15
- Running:
16
-
17
- mod_spox
18
-
19
- == Requirements
20
-
21
- * sequel
22
- * database driver
23
-
24
- == Optional
25
-
26
- * fastthread
27
-
28
- == Install
29
-
30
- sudo gem install --include-dependencies mod_spox
31
-
32
- == License
33
-
34
- mod_spox is licensed under the GPLv3
35
-
36
- Copyright (c) 2008 spox <spox@modspox.com>
@@ -1,57 +0,0 @@
1
- module ModSpox
2
- class Cache
3
- def initialize(size)
4
- @size = size
5
- @cache = Hash.new
6
- @times = Hash.new
7
- @store_lock = Mutex.new
8
- @read_lock = Mutex.new
9
- end
10
-
11
- def [](key)
12
- if(@cache.has_key?(key.to_sym))
13
- @times[key.to_sym] = Time.now
14
- return @cache[key.to_sym]
15
- else
16
- return nil
17
- end
18
- end
19
-
20
- def has_key?(key)
21
- @read_lock.synchronize do
22
- return @cache.has_key?(key.to_sym)
23
- end
24
- end
25
-
26
- def []=(key, value)
27
- @store_lock.synchronize do
28
- if(@cache.size > @size)
29
- del_key = oldest_key
30
- unless(key.nil?)
31
- @cache.delete(del_key)
32
- @times.delete(del_key)
33
- end
34
- end
35
- @cache[key.to_sym] = value
36
- @times[key.to_sym] = Time.now
37
- end
38
- end
39
-
40
- def delete(key)
41
- @read_lock.synchronize do
42
- @cache.delete(key.to_sym) if @cache.has_key?(key.to_sym)
43
- @times.delete(key.to_sym) if @times.has_key?(key.to_sym)
44
- end
45
- end
46
-
47
- private
48
-
49
- def oldest_key
50
- result = nil
51
- @read_lock.synchronize do
52
- result = @times.sort{|a,b| a[1] <=> b[1]}[0][0]
53
- end
54
- return result
55
- end
56
- end
57
- end
@@ -1,84 +0,0 @@
1
- module ModSpox
2
- module Monitors
3
-
4
- # The Timer is a time based monitor (thus the
5
- # "Timer" part of the name)
6
- class Timer
7
-
8
- # Create a new Timer Monitor
9
- def initialize
10
- @threads = Array.new
11
- end
12
-
13
- # Force the monitor to wake everyone up
14
- def wakeup
15
- @threads.each do |t|
16
- begin
17
- t.wakeup
18
- rescue Object => boom
19
- # thread was dead #
20
- end
21
- end
22
- @threads.clear
23
- end
24
-
25
- # How long the monitor should wait
26
- def wait(time=nil)
27
- @threads << Thread.current
28
- if(time.nil?)
29
- sleep
30
- else
31
- sleep(time)
32
- end
33
- end
34
-
35
- end
36
-
37
- # The Boolean is a boolean based monitor (thus the
38
- # "Boolean" part of the name)
39
- class Boolean
40
-
41
- # Create a new Boolean Monitor
42
- def initialize
43
- @threads = []
44
- end
45
-
46
- # Stop waiting
47
- def wakeup
48
- return if @threads.empty?
49
- @threads.each do |t|
50
- begin
51
- t.wakeup
52
- rescue Object => boom
53
- # thread was dead #
54
- end
55
- end
56
- @threads.clear
57
- end
58
-
59
- # Start waiting
60
- def wait
61
- @threads << Thread.current
62
- sleep
63
- end
64
-
65
- # Returns if a thread is currently waiting in this monitor
66
- def thread_waiting?(thread)
67
- return @threads.include?(thread)
68
- end
69
-
70
- # Removes a thread from the list of waiting. Will be removed automatically
71
- # if thread has been killed on next call to wakeup
72
- def remove_thread(thread)
73
- @threads.delete(thread) if @threads.include?(thread)
74
- end
75
-
76
- # Returns the number of threads currently waiting in this monitor
77
- def count
78
- @threads.size
79
- end
80
-
81
- end
82
- end
83
-
84
- end
@@ -1,164 +0,0 @@
1
- ['mod_spox/Logger',
2
- 'mod_spox/Exceptions',
3
- 'timeout',
4
- 'singleton'].each{|f|require f}
5
-
6
- module ModSpox
7
-
8
- class PoolThread
9
- def initialize(pool, timeout)
10
- @pool = pool
11
- @timeout = timeout
12
- @kill = false
13
- @thread = Thread.new do
14
- until @kill do
15
- begin
16
- action = nil
17
- if(Pool.workers > Pool.workers_min)
18
- Timeout::timeout(60) do
19
- action = @pool.queue.pop
20
- end
21
- else
22
- action = @pool.queue.pop
23
- end
24
- run(action) unless action.nil?
25
- rescue Timeout::Error => boom
26
- @kill = true
27
- rescue Object => boom
28
- Logger.warn("Pool thread error: #{boom}")
29
- end
30
- end
31
- @pool.remove(self)
32
- end
33
- end
34
-
35
- private
36
-
37
- def run(action)
38
- begin
39
- if(@timeout > 0)
40
- Timeout::timeout(@timeout) do
41
- action.call
42
- end
43
- else
44
- action.call
45
- end
46
- rescue Timeout::Error => boom
47
- Logger.warn("Pool worker timed out during execution of action (#{@timeout} sec limit): #{action}")
48
- rescue Object => boom
49
- Logger.warn("Pool worker caught an unknown exception: #{boom}")
50
- end
51
- end
52
- end
53
-
54
- # The Pool class is used to reduce thread creation. It provides
55
- # an easy way to process many actions in an asynchronous manner.
56
- class Pool
57
-
58
- include Singleton
59
-
60
- # Add an action to the pool to be processed
61
- def Pool.<<(action)
62
- Pool.instance.add(action)
63
- end
64
-
65
- # Alias of Pool.<<(action)
66
- def Pool.queue(action)
67
- Pool << action
68
- end
69
-
70
- def Pool.workers
71
- Pool.instance.threads.size
72
- end
73
-
74
- def Pool.workers_min
75
- return Pool.instance.min
76
- end
77
-
78
- def Pool.workers_max
79
- return Pool.instance.max
80
- end
81
-
82
- def remove(pt)
83
- @threads.delete(pt)
84
- Logger.info("Pool thread has been removed: #{pt}")
85
- end
86
-
87
- def add(action)
88
- @queue << action
89
- create_pool_thread if @queue.size > @min
90
- end
91
-
92
- # Return maximum number of seconds actions are allowed to process
93
- def Pool.worker_timeout
94
- Pool.instance.timeout
95
- end
96
-
97
- # time:: number of seconds actions are allowed
98
- # Set number of seconds actions are allowed to work
99
- def Pool.worker_timeout=(time)
100
- Pool.instance.timeout = time
101
- end
102
-
103
- # Set maximum number of workers to process tasks
104
- def Pool.workers_max=(max)
105
- Pool.instance.workers_max = max
106
- end
107
-
108
- # Not currently implemented
109
- def Pool.workers_min=(min)
110
- Pool.instance.workers_min = min
111
- end
112
-
113
- attr_reader :threads
114
- attr_reader :queue
115
- attr_reader :min
116
- attr_reader :max
117
- attr_reader :timeout
118
-
119
- def initialize
120
- @queue = Queue.new
121
- @threads = []
122
- @lock = Mutex.new
123
- @timeout = get_value('pool_timeout', 0).to_i
124
- @max = Database.type != :pgsql ? 1 : get_value('pool_workers_max', 7).to_i
125
- @min = Database.type != :pgsql ? 1 : get_value('pool_workers_min', 5).to_i
126
- @min.times{create_pool_thread}
127
- end
128
-
129
- def create_pool_thread(force=false)
130
- return nil unless @threads.size < @max || force
131
- pt = PoolThread.new(self, @timeout)
132
- @threads << pt
133
- return pt
134
- end
135
-
136
- def get_value(n, default)
137
- m = Models::Config.filter(:name => n).first
138
- return m.nil? ? default : m.value
139
- end
140
-
141
- def set_value(n, v)
142
- m = Models::Config.find_or_create(:name => n)
143
- m.value = v
144
- m.save
145
- end
146
-
147
- def timeout=(v)
148
- set_value('pool_timeout', v.to_i)
149
- @timeout = v.to_i
150
- end
151
-
152
- def workers_max=(v)
153
- set_value('pool_workers_max', v.to_i)
154
- @max = v.to_i
155
- end
156
-
157
- def workers_min=(v)
158
- set_value('pool_workers_min', v.to_i)
159
- @min = v.to_i
160
- end
161
-
162
- end
163
-
164
- end
@@ -1,16 +0,0 @@
1
- module ModSpox
2
- module Models
3
- class AuthGroup < Sequel::Model
4
-
5
- set_primary_key [:group_id, :auth_id]
6
-
7
- def auth
8
- Auth[auth_id]
9
- end
10
-
11
- def group
12
- Group[group_id]
13
- end
14
- end
15
- end
16
- end
@@ -1,14 +0,0 @@
1
- module ModSpox
2
- module Models
3
- # Attribute provided by model:
4
- # mode:: mode that is set
5
- class ChannelMode < Sequel::Model
6
-
7
- # Channel this mode is associated to
8
- def channel
9
- Channel[channel_id]
10
- end
11
-
12
- end
13
- end
14
- end
@@ -1,45 +0,0 @@
1
- module ModSpox
2
- module Models
3
- # This model is for internal use only to provide a
4
- # proper relation between Nick and Channel
5
- class NickChannel < Sequel::Model
6
-
7
- include Models
8
-
9
- set_primary_key [:nick_id, :channel_id]
10
-
11
- after_save do
12
- c = Channel[channel_id]
13
- n = Nick[nick_id]
14
- n.visible = true
15
- n.save
16
- c.parked = true
17
- c.save
18
- end
19
-
20
- after_destroy do
21
- c = Channel[channel_id]
22
- n = Nick[nick_id]
23
- if(n.channels.size < 1)
24
- n.visible = false
25
- n.save
26
- NickMode.filter(:nick_id => nick_id).each{|n|n.destroy}
27
- end
28
- if(c.nicks.size < 1)
29
- c.parked = false
30
- c.save
31
- NickMode.filter(:channel_id => channel_id).each{|n|n.destroy}
32
- ChannelMode.filter(:channel_id => channel_id).each{|n|n.destroy}
33
- end
34
- end
35
-
36
- def nick
37
- Nick[nick_id]
38
- end
39
-
40
- def channel
41
- Channel[channel_id]
42
- end
43
- end
44
- end
45
- end
@@ -1,16 +0,0 @@
1
- module ModSpox
2
- module Models
3
- class NickGroup < Sequel::Model
4
-
5
- set_primary_key [:nick_id, :group_id]
6
-
7
- def nick
8
- Nick[nick_id]
9
- end
10
-
11
- def group
12
- Group[group_id]
13
- end
14
- end
15
- end
16
- end