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
data/lib/mod_spox/models/Nick.rb
CHANGED
@@ -1,4 +1,10 @@
|
|
1
1
|
require 'socket'
|
2
|
+
require 'mod_spox/models/Auth'
|
3
|
+
require 'mod_spox/models/Channel'
|
4
|
+
require 'mod_spox/models/NickMode'
|
5
|
+
require 'mod_spox/models/AuthMask'
|
6
|
+
|
7
|
+
|
2
8
|
|
3
9
|
module ModSpox
|
4
10
|
module Models
|
@@ -15,13 +21,29 @@ module ModSpox
|
|
15
21
|
# visible:: can the bot see the user (is in a channel the bot is parked)
|
16
22
|
# away:: is nick away
|
17
23
|
# botnick:: is the nick of the bot
|
18
|
-
|
24
|
+
|
19
25
|
class Nick < Sequel::Model
|
20
26
|
|
21
|
-
|
27
|
+
one_to_many :auths, :one_to_one => true, :class => 'ModSpox::Models::Auth'
|
28
|
+
many_to_many :channels, :join_table => :nick_channels, :class => 'ModSpox::Models::Channel'
|
29
|
+
one_to_many :modes, :class => 'ModSpox::Models::NickMode'
|
30
|
+
many_to_many :auth_masks, :join_table => :auth_masks_nicks, :class => 'ModSpox::Models::AuthMask'
|
22
31
|
|
32
|
+
# nick_name:: nick of user
|
33
|
+
# override to downcase nick
|
23
34
|
def nick=(nick_name)
|
24
|
-
|
35
|
+
nick_name.downcase!
|
36
|
+
super(nick_name)
|
37
|
+
end
|
38
|
+
|
39
|
+
def Nick.find_or_create(args)
|
40
|
+
args[:nick].downcase! if args[:nick]
|
41
|
+
super(args)
|
42
|
+
end
|
43
|
+
|
44
|
+
def Nick.filter(args)
|
45
|
+
args[:nick].downcase! if args[:nick]
|
46
|
+
super(args)
|
25
47
|
end
|
26
48
|
|
27
49
|
def Nick.locate(string, create = true)
|
@@ -33,169 +55,139 @@ module ModSpox
|
|
33
55
|
end
|
34
56
|
return nick
|
35
57
|
end
|
36
|
-
|
37
|
-
|
38
|
-
|
58
|
+
|
59
|
+
# addr: users address
|
60
|
+
# make sure everything is set properly
|
61
|
+
# when the address is set
|
62
|
+
def address=(addr)
|
63
|
+
return if (!values[:address].nil? && !values[:host].nil?) && (values[:address] == addr || values[:host] == addr)
|
39
64
|
oldaddress = values[:address]
|
40
65
|
begin
|
41
66
|
info = Object::Socket.getaddrinfo(address, nil)
|
42
|
-
|
43
|
-
|
67
|
+
addr = info[0][3]
|
68
|
+
update :host => info[0][2]
|
69
|
+
super(addr)
|
44
70
|
rescue Object => boom
|
45
|
-
|
46
|
-
|
71
|
+
super(addr)
|
72
|
+
update :host => address
|
47
73
|
ensure
|
48
74
|
if values[:address] != oldaddress
|
49
|
-
|
75
|
+
auth.update(:authed => false)
|
50
76
|
end
|
51
77
|
end
|
52
78
|
end
|
53
79
|
|
80
|
+
# val:: bool
|
81
|
+
# sets if nick is currently visible. if
|
82
|
+
# not all relating information is cleared
|
54
83
|
def visible=(val)
|
55
84
|
unless(val)
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
85
|
+
update :username => nil
|
86
|
+
update :real_name => nil
|
87
|
+
update :address => nil
|
88
|
+
update :source => nil
|
89
|
+
update :connected_at => nil
|
90
|
+
update :connected_to => nil
|
91
|
+
update :seconds_idle => nil
|
92
|
+
update :away => false
|
93
|
+
remove_all_channels
|
94
|
+
auth.update(:authed => false)
|
64
95
|
end
|
65
|
-
|
66
|
-
end
|
67
|
-
|
68
|
-
def source=(mask)
|
69
|
-
super
|
96
|
+
super(val)
|
70
97
|
end
|
71
98
|
|
72
99
|
# Auth model associated with nick
|
73
100
|
def auth
|
74
|
-
|
101
|
+
if(auths.empty?)
|
102
|
+
a = Auth.find_or_create(:nick_id => pk)
|
103
|
+
add_auth(a)
|
104
|
+
end
|
105
|
+
auths[0].refresh
|
106
|
+
return auths[0]
|
75
107
|
end
|
76
108
|
|
77
109
|
# AuthGroups nick is authed to
|
78
110
|
def auth_groups
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
nickgroups = NickGroup.filter(:nick_id => pk)
|
83
|
-
end
|
84
|
-
groups = []
|
85
|
-
NickGroup.filter(:nick_id => pk).each do | nickgroup |
|
86
|
-
groups << nickgroup.group
|
111
|
+
g = (auth.groups.empty? || !auth.authed) ? [] : auth.groups
|
112
|
+
unless(auth_masks.empty?)
|
113
|
+
auth_masks.each{|am| g += am.groups}
|
87
114
|
end
|
88
|
-
return
|
115
|
+
return g
|
89
116
|
end
|
90
117
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
auth.groups.each do |group|
|
97
|
-
NickGroup.find_or_create(:nick_id => pk, :group_id => group.pk)
|
98
|
-
end
|
118
|
+
# Checks nick's source against available
|
119
|
+
# authentication masks
|
120
|
+
def check_masks
|
121
|
+
AuthMask.all.each do |am|
|
122
|
+
add_auth_mask(am) if source =~ /#{am.mask}/ && !auth_masks.include?(am)
|
99
123
|
end
|
100
|
-
Auth.where('mask is not null').each do |a|
|
101
|
-
[source, "#{nick}!#{username}@#{host}", "#{nick}!#{username}@#{address}"].each do |chk_src|
|
102
|
-
Logger.info("Matching AUTH - #{chk_src} against #{a.mask}")
|
103
|
-
if(chk_src =~ /#{a.mask}/)
|
104
|
-
auth_ids << a.pk unless auth_ids.include?(a.pk)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
auth_ids.each{|id| AuthGroup.filter(:auth_id => id).each{|ag| group_ids << ag.group_id}}
|
109
|
-
group_ids.uniq.each{|id| NickGroup.find_or_create(:nick_id => pk, :group_id => id)}
|
110
|
-
end
|
111
|
-
|
112
|
-
# Set nick as member of given group
|
113
|
-
def group=(group)
|
114
|
-
auth.group = group
|
115
124
|
end
|
116
125
|
|
126
|
+
# group:: Models::Group
|
127
|
+
# Return if nick is member of given group
|
117
128
|
def in_group?(group)
|
118
129
|
group = Group.filter(:name => group).first if group.is_a?(String)
|
119
130
|
return group.nil? ? false : auth_groups.include?(group)
|
120
131
|
end
|
121
132
|
|
122
|
-
# Remove nick from given group
|
123
|
-
def remove_group(group)
|
124
|
-
auth.remove_group(group)
|
125
|
-
end
|
126
|
-
|
127
|
-
# Clear this nick's auth status
|
128
|
-
def clear_auth
|
129
|
-
auth.authenticated(false)
|
130
|
-
NickGroup.filter(:nick_id => pk).destroy
|
131
|
-
end
|
132
|
-
|
133
133
|
# Modes associated with this nick
|
134
134
|
def nick_modes
|
135
|
-
|
136
|
-
end
|
137
|
-
|
138
|
-
# Add channel nick is found in
|
139
|
-
def channel_add(channel)
|
140
|
-
NickChannel.find_or_create(:nick_id => pk, :channel_id => channel.pk)
|
141
|
-
end
|
142
|
-
|
143
|
-
# Remove channel nick is no longer found in
|
144
|
-
def channel_remove(channel)
|
145
|
-
NickChannel.filter(:nick_id => pk, :channel_id => channel.pk).first.destroy
|
146
|
-
if(NickChannel.filter(:nick_id => pk).count < 1)
|
147
|
-
clear_auth
|
148
|
-
visible = false
|
149
|
-
end
|
135
|
+
modes
|
150
136
|
end
|
151
137
|
|
152
138
|
# Remove all channels
|
153
139
|
def clear_channels
|
154
|
-
|
140
|
+
remove_all_channels
|
155
141
|
visible = false
|
156
|
-
clear_auth
|
157
|
-
end
|
158
|
-
|
159
|
-
# Channels nick is currently in
|
160
|
-
def channels
|
161
|
-
chans = []
|
162
|
-
NickChannel.filter(:nick_id => pk).each do |nc|
|
163
|
-
chans << nc.channel
|
164
|
-
end
|
165
|
-
return chans
|
166
142
|
end
|
167
143
|
|
168
144
|
# channel:: Models::Channel
|
169
145
|
# Return if nick is operator in given channel
|
170
146
|
def is_op?(channel)
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
return false
|
147
|
+
raise Exceptions::NotInChannel.new(channel) unless channels_dataset.filter(:channel_id => channel.pk).count > 0
|
148
|
+
m = NickMode.filter(:nick_id => pk, :channel_id => channel.pk).first
|
149
|
+
return m ? m.set?('o') : false
|
175
150
|
end
|
176
151
|
|
177
152
|
# channel:: Models::Channel
|
178
153
|
# Return if nick is voiced in given channel
|
179
154
|
def is_voice?(channel)
|
180
|
-
|
181
|
-
|
155
|
+
raise Exceptions::NotInChannel.new(channel) unless channels_dataset.filter(:channel_id => channel.pk).count > 0
|
156
|
+
m = NickMode.filter(:nick_id => pk, :channel_id => channel.pk).first
|
157
|
+
return m ? m.set?('v') : false
|
158
|
+
end
|
159
|
+
|
160
|
+
def set_mode(m)
|
161
|
+
m.each_char do |c|
|
162
|
+
update(:mode => "#{mode}#{c}") if mode.index(c).nil?
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def unset_mode(m)
|
167
|
+
m.each_char do |c|
|
168
|
+
update(:mode => mode.gsub(c,'')) unless mode.index(c).nil?
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
def mode_set?(m)
|
173
|
+
return !mode.index(m).nil?
|
174
|
+
end
|
175
|
+
|
176
|
+
def add_channel(c)
|
177
|
+
unless(channels_dataset.filter(:channel_id => c.pk).count > 0)
|
178
|
+
super(c)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def remove_channel(c)
|
183
|
+
if(channels_dataset.filter(:channel_id => c.pk).count > 0)
|
184
|
+
super(c)
|
182
185
|
end
|
183
|
-
return false
|
184
186
|
end
|
185
187
|
|
188
|
+
# TODO: rewrite this to work
|
186
189
|
def Nick.transfer_groups(old_nick, new_nick)
|
187
|
-
|
188
|
-
end
|
189
|
-
|
190
|
-
# Purge all nick information
|
191
|
-
def self.clean
|
192
|
-
Nick.set(:username => nil, :real_name => nil, :address => nil,
|
193
|
-
:source => nil, :connected_at => nil, :connected_to => nil,
|
194
|
-
:seconds_idle => nil, :away => false, :visible => false, :botnick => false)
|
195
|
-
NickMode.destroy_all
|
196
|
-
NickChannel.destroy_all
|
197
|
-
NickGroup.destroy_all
|
198
|
-
Auth.set(:authed => false)
|
190
|
+
# do nothing
|
199
191
|
end
|
200
192
|
|
201
193
|
end
|
@@ -1,17 +1,31 @@
|
|
1
|
+
require 'mod_spox/models/Nick'
|
2
|
+
require 'mod_spox/models/Channel'
|
1
3
|
module ModSpox
|
2
4
|
module Models
|
3
|
-
# Attributes provided by model:
|
4
|
-
# mode:: Mode that is set
|
5
|
-
class NickMode < Sequel::Model
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
class NickMode < Sequel::Model
|
7
|
+
many_to_one :nick, :class => 'ModSpox::Models::Nick'
|
8
|
+
many_to_one :channel, :class => 'ModSpox::Models::Channel'
|
9
|
+
|
10
|
+
# m:: mode character
|
11
|
+
# add a mode for a nick channel combo
|
12
|
+
def set_mode(m)
|
13
|
+
update(:mode => "#{values[:mode]}#{m}") if values[:mode].nil? || values[:mode].index(m).nil?
|
14
|
+
end
|
15
|
+
|
16
|
+
# m:: mode character
|
17
|
+
# remove a mode for a nick channel combo
|
18
|
+
def unset_mode(m)
|
19
|
+
update(:mode => values[:mode].gsub(m, ''))
|
10
20
|
end
|
11
21
|
|
12
|
-
|
13
|
-
|
14
|
-
|
22
|
+
def set?(m)
|
23
|
+
return mode.nil? ? false : !mode.index(m).nil?
|
24
|
+
end
|
25
|
+
|
26
|
+
# clear all modes for a nick channel combo
|
27
|
+
def clear_modes
|
28
|
+
update(:mode => '')
|
15
29
|
end
|
16
30
|
end
|
17
31
|
end
|
@@ -7,8 +7,19 @@ module ModSpox
|
|
7
7
|
# connected:: bot is connected to this server
|
8
8
|
class Server < Sequel::Model
|
9
9
|
|
10
|
+
def Server.filter(args={})
|
11
|
+
args[:host].downcase! if args.has_key?(:host)
|
12
|
+
super(args)
|
13
|
+
end
|
14
|
+
|
15
|
+
def Server.find_or_create(args={})
|
16
|
+
args[:host].downcase! if args.has_key?(:host)
|
17
|
+
super(args)
|
18
|
+
end
|
19
|
+
|
10
20
|
def host=(host_name)
|
11
|
-
|
21
|
+
host_name.downcase!
|
22
|
+
super(host_name)
|
12
23
|
end
|
13
24
|
|
14
25
|
end
|
@@ -6,38 +6,34 @@ module ModSpox
|
|
6
6
|
#
|
7
7
|
# This model can be used to store complex objects. These objects are dumped
|
8
8
|
# and stored for later retrieval
|
9
|
+
# TODO: remove [] from any usage
|
9
10
|
class Setting < Sequel::Model
|
10
11
|
|
11
12
|
#serialize(:value, :format => :marshal)
|
12
13
|
|
13
14
|
def name=(setting_name)
|
14
|
-
|
15
|
+
setting_name.downcase!
|
16
|
+
super(setting_name)
|
15
17
|
end
|
16
18
|
|
17
19
|
def value=(val)
|
18
|
-
|
20
|
+
val = [Marshal.dump(val.dup)].pack('m')
|
21
|
+
super(val)
|
19
22
|
end
|
20
23
|
|
21
24
|
def value
|
22
25
|
return values[:value] ? Marshal.load(values[:value].unpack('m')[0]) : nil
|
23
26
|
end
|
24
27
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
setting = Setting.filter(:name => key).first
|
30
|
-
return setting ? setting.value : nil
|
28
|
+
def Setting.set(sym, value)
|
29
|
+
s = Setting.find_or_create(:name => "#{sym}")
|
30
|
+
s.value = value
|
31
|
+
s.save
|
31
32
|
end
|
32
33
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
# Note: Will fail if attempting to save hashes. Must set value explicitly
|
37
|
-
def self.[]=(key, val)
|
38
|
-
key = key.to_s if key.is_a?(Symbol)
|
39
|
-
model = Setting.find_or_create(:name => key)
|
40
|
-
model.update_with_params(:value => [Marshal.dump(val.dup)].pack('m'))
|
34
|
+
def Setting.val(sym)
|
35
|
+
s = Setting.filter(:name => "#{sym}").first
|
36
|
+
return s ? s.value : nil
|
41
37
|
end
|
42
38
|
end
|
43
39
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'mod_spox/models/Group'
|
2
|
+
|
1
3
|
module ModSpox
|
2
4
|
module Models
|
3
5
|
# Attributes provided by model:
|
@@ -8,23 +10,41 @@ module ModSpox
|
|
8
10
|
# description:: description of trigger
|
9
11
|
class Signature < Sequel::Model
|
10
12
|
|
11
|
-
|
13
|
+
many_to_one :group, :class => 'ModSpox::Models::Group'
|
12
14
|
|
13
15
|
def params=(prms)
|
14
|
-
raise InvalidType.new('Parameter names must be provided in an array') unless prms.kind_of?(Array)
|
15
|
-
|
16
|
+
raise Exceptions::InvalidType.new('Parameter names must be provided in an array') unless prms.nil? || prms.kind_of?(Array)
|
17
|
+
prms = prms.join('|') unless prms.nil?
|
18
|
+
super(prms)
|
16
19
|
end
|
17
20
|
|
18
21
|
def params
|
19
22
|
return values[:params].nil? ? [] : values[:params].split('|')
|
20
23
|
end
|
21
24
|
|
22
|
-
def
|
23
|
-
|
25
|
+
def signature=(v)
|
26
|
+
v = [Marshal.dump(v)].pack('m')
|
27
|
+
super(v)
|
24
28
|
end
|
25
|
-
|
26
|
-
def
|
27
|
-
|
29
|
+
|
30
|
+
def signature
|
31
|
+
values[:signature] ? Marshal.load(values[:signature].unpack('m')[0]) : nil
|
32
|
+
end
|
33
|
+
|
34
|
+
def Signature.find_or_create(args)
|
35
|
+
t = nil
|
36
|
+
if(args.has_key?(:signature) && args.has_key?(:params) && args.has_key?(:method) && args.has_key?(:plugin))
|
37
|
+
args[:params] = [] if args[:params].nil?
|
38
|
+
Signature.filter(:method => args[:method], :plugin => args[:plugin], :params => args[:params].join('|')).each do |s|
|
39
|
+
t = s if s.signature == args[:signature]
|
40
|
+
end
|
41
|
+
args[:params] = nil if args[:params].empty?
|
42
|
+
end
|
43
|
+
unless(t)
|
44
|
+
t = create(args)
|
45
|
+
end
|
46
|
+
t.update(:enabled => true)
|
47
|
+
return t
|
28
48
|
end
|
29
49
|
|
30
50
|
end
|