ceml 0.7.4 → 0.7.5
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/VERSION +1 -1
- data/ceml.gemspec +1 -1
- data/lib/ceml/casting_statement.rb +13 -1
- data/lib/ceml/driver.rb +39 -30
- data/lib/ceml/incident.rb +23 -14
- data/lib/ceml/role.rb +4 -1
- data/test/test_release.rb +11 -39
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.7.
|
1
|
+
0.7.5
|
data/ceml.gemspec
CHANGED
@@ -7,7 +7,10 @@ module CEML
|
|
7
7
|
def roles_to_cast(script)
|
8
8
|
return [] unless type == :await
|
9
9
|
roles.list.map do |r|
|
10
|
-
|
10
|
+
matching = []
|
11
|
+
matching << matching_text if matching_text
|
12
|
+
matching += [:city] if radius
|
13
|
+
c = Criteria.new(r.qualifiers, [], matching, radius, timewindow)
|
11
14
|
Role.new r.name, c, r.min..r.max, []
|
12
15
|
end
|
13
16
|
end
|
@@ -30,6 +33,15 @@ module CEML
|
|
30
33
|
modifiers.elements.select{ |m| m.respond_to? :duration }.first
|
31
34
|
end
|
32
35
|
|
36
|
+
def with_matching_phrase
|
37
|
+
return if modifiers.empty?
|
38
|
+
modifiers.elements.select{ |m| m.respond_to? :thing }.first
|
39
|
+
end
|
40
|
+
|
41
|
+
def matching_text
|
42
|
+
with_matching_phrase && with_matching_phrase.thing.text_value
|
43
|
+
end
|
44
|
+
|
33
45
|
def timewindow
|
34
46
|
over_phrase && over_phrase.duration.seconds
|
35
47
|
end
|
data/lib/ceml/driver.rb
CHANGED
@@ -17,6 +17,12 @@ module CEML
|
|
17
17
|
INCIDENTS[id] ||= CEML::Incident.new to_bytecode(script), id if script
|
18
18
|
raise "no incident #{id}" unless INCIDENTS[id]
|
19
19
|
yield INCIDENTS[id], PLAYERS[id], metadata if block_given?
|
20
|
+
|
21
|
+
PLAYERS[id].select{ |p| p[:released] }.each do |p|
|
22
|
+
release p
|
23
|
+
ping_all p[:script_collection_id], p
|
24
|
+
end
|
25
|
+
|
20
26
|
id
|
21
27
|
end
|
22
28
|
alias_method :start, :with_incident
|
@@ -48,15 +54,24 @@ module CEML
|
|
48
54
|
SCRIPTS[script_collection_id].each{ |s| release script_collection_id, s.roles_to_cast, candidate }
|
49
55
|
end
|
50
56
|
|
57
|
+
def release p
|
58
|
+
p[:tags] -= ['new']
|
59
|
+
if p[:released] =~ /^(\w+)=/
|
60
|
+
p[:tags].delete_if{ |t| t =~ /^#{$1}=/ }
|
61
|
+
end
|
62
|
+
p[:tags] += [p[:released]]
|
63
|
+
[:pc, :roles, :released].each{ |sym| p.delete(sym) }
|
64
|
+
(p[:matchables]||={}).update (p[:qs_answers]||{})
|
65
|
+
end
|
51
66
|
|
52
|
-
def launch script_collection_id, roleset, *cast
|
67
|
+
def launch id, script_collection_id, roleset, *cast
|
53
68
|
script = SCRIPTS[script_collection_id].select{ |s| s.roles_to_cast == roleset }.sort_by{ rand }.first
|
54
69
|
unless script
|
55
70
|
rolesets = SCRIPTS[script_collection_id].map(&:roles_to_cast)
|
56
71
|
raise "matching roleset not found: #{roleset.inspect} in #{rolesets.inspect}"
|
57
72
|
end
|
58
73
|
log "launching #{script.bytecode.inspect} with cast #{cast.inspect}"
|
59
|
-
push
|
74
|
+
push id, script.bytecode, *cast
|
60
75
|
end
|
61
76
|
|
62
77
|
|
@@ -69,29 +84,34 @@ module CEML
|
|
69
84
|
return unless roleset.any?{ |r| r.fits? candidate }
|
70
85
|
candidate[:ts] = CEML.clock
|
71
86
|
already_launched_with = nil
|
87
|
+
run_after = []
|
72
88
|
|
73
89
|
with_confluences script_collection_id, roleset do |confluences|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
90
|
+
already_launched_with = nil
|
91
|
+
# live_with = confluences.select{ |c| c.live_with?(candidate) }
|
92
|
+
# if not live_with.empty?
|
93
|
+
# already_launched_with = live_with.first.incident_id
|
94
|
+
# live_with.each{ |c| c.rm candidate } if involvement != :sticky
|
95
|
+
# break if involvement != :released
|
96
|
+
# end
|
80
97
|
|
81
98
|
locs = confluences.group_by{ |l| l.stage_with_candidate(candidate) }
|
82
99
|
if locs[:joinable]
|
83
100
|
log "joining..."
|
84
101
|
first = locs[:joinable].shift
|
85
102
|
first.push candidate unless first.incident_id == already_launched_with
|
86
|
-
|
103
|
+
# JOIN THEM
|
104
|
+
run_after << [:push, first.incident_id, nil, candidate]
|
87
105
|
|
88
106
|
elsif locs[:launchable]
|
89
107
|
log "launching..."
|
90
108
|
first = locs[:launchable].shift
|
91
109
|
first.push candidate
|
92
110
|
cast = first.cast
|
93
|
-
first.incident_id =
|
111
|
+
first.incident_id = gen_code
|
94
112
|
(locs[:launchable] + (locs[:listable]||[])).each{ |l| l.rm *cast }
|
113
|
+
# LAUNCH
|
114
|
+
run_after << [:launch, first.incident_id, script_collection_id, roleset, *cast]
|
95
115
|
|
96
116
|
elsif locs[:listable]
|
97
117
|
log "listing..."
|
@@ -103,7 +123,8 @@ module CEML
|
|
103
123
|
if c.stage_with_candidate(candidate) == :launchable
|
104
124
|
log "start-launching..."
|
105
125
|
c.push candidate
|
106
|
-
c.incident_id =
|
126
|
+
c.incident_id = gen_code
|
127
|
+
run_after << [:launch, c.incident_id, script_collection_id, roleset, candidate]
|
107
128
|
else
|
108
129
|
c.push candidate
|
109
130
|
end
|
@@ -112,10 +133,14 @@ module CEML
|
|
112
133
|
confluences.delete_if(&:over?)
|
113
134
|
end
|
114
135
|
|
115
|
-
|
116
|
-
|
117
|
-
push already_launched_with, nil, candidate
|
136
|
+
run_after.each do |cmd|
|
137
|
+
send(*cmd)
|
118
138
|
end
|
139
|
+
|
140
|
+
# if already_launched_with and involvement == :sticky
|
141
|
+
# puts "PUSHING INSTEAD"
|
142
|
+
# push already_launched_with, nil, candidate
|
143
|
+
# end
|
119
144
|
end
|
120
145
|
|
121
146
|
def push incident_id, script, *updated_players
|
@@ -164,21 +189,5 @@ module CEML
|
|
164
189
|
# def player_start(data, what)
|
165
190
|
# puts "STARTED #{data[:player].inspect}"
|
166
191
|
# end
|
167
|
-
|
168
|
-
def player_released(data, tag)
|
169
|
-
p = data[:player].dup
|
170
|
-
p[:tags] -= ['new']
|
171
|
-
if tag =~ /^(\w+)=/
|
172
|
-
p[:tags].delete_if{ |t| t =~ /^#{$1}=/ }
|
173
|
-
end
|
174
|
-
p[:tags] += [tag]
|
175
|
-
p.delete :pc
|
176
|
-
p.delete :roles
|
177
|
-
data[:player][:released] = true
|
178
|
-
# data[:players].delete_if{ |pl| pl[:id] == p[:id] }
|
179
|
-
puts "released: #{p.inspect} with #{tag}"
|
180
|
-
# puts "remaining players: #{data[:players].inspect}"
|
181
|
-
ping_all p[:script_collection_id], p, true
|
182
|
-
end
|
183
192
|
end
|
184
193
|
end
|
data/lib/ceml/incident.rb
CHANGED
@@ -28,22 +28,30 @@ module CEML
|
|
28
28
|
def run(players, &blk)
|
29
29
|
@players = players
|
30
30
|
@callback = blk
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
instr
|
41
|
-
|
42
|
-
|
31
|
+
|
32
|
+
loop do
|
33
|
+
players = @players.select{ |p| !p[:released] }
|
34
|
+
# puts "playing with #{players.map{|p|p[:id]}}"
|
35
|
+
advanced = false
|
36
|
+
players.each do |p|
|
37
|
+
@this = p
|
38
|
+
# puts "trying #{@this[:id]}"
|
39
|
+
next unless instr = seq[pc]
|
40
|
+
instr = instr.dup
|
41
|
+
if not rolematch(instr.shift)
|
42
|
+
this[:pc]+=1
|
43
|
+
advanced = true
|
44
|
+
else
|
45
|
+
instr << role_info if instr.first == :start #tmp hack
|
46
|
+
next unless send(*instr)
|
47
|
+
cb(*instr)
|
48
|
+
this[:pc]+=1
|
49
|
+
advanced = true
|
50
|
+
end
|
43
51
|
end
|
44
|
-
|
45
|
-
this[:pc]+=1
|
52
|
+
break unless advanced
|
46
53
|
end
|
54
|
+
|
47
55
|
@callback = @players = nil
|
48
56
|
end
|
49
57
|
|
@@ -171,6 +179,7 @@ module CEML
|
|
171
179
|
|
172
180
|
def release x
|
173
181
|
return true if x[:cond] and not expectation(*x[:cond])
|
182
|
+
this[:released] = x[:tag]
|
174
183
|
cb :released, x[:tag]
|
175
184
|
false
|
176
185
|
end
|
data/lib/ceml/role.rb
CHANGED
@@ -41,7 +41,10 @@ module CEML
|
|
41
41
|
return true unless star
|
42
42
|
c = criteria
|
43
43
|
if c.matching
|
44
|
-
return unless c.matching.all?
|
44
|
+
return unless c.matching.all? do |g|
|
45
|
+
candidate[:matchables][g] && star[:matchables][g] &&
|
46
|
+
candidate[:matchables][g].downcase.strip == star[:matchables][g].downcase.strip
|
47
|
+
end
|
45
48
|
end
|
46
49
|
if c.radius
|
47
50
|
c_ll = Geokit::LatLng(candidate[:lat], candidate[:lng])
|
data/test/test_release.rb
CHANGED
@@ -44,40 +44,13 @@ await 1 new signup
|
|
44
44
|
ask signup re first_name:
|
45
45
|
Thanks for signing up for Infatuated!
|
46
46
|
What's your first name?
|
47
|
-
ask signup re
|
48
|
-
Do you have an Infatuated Match Card you want to use?
|
49
|
-
(These are available at the Infatuated table on the first floor.)
|
50
|
-
release signup as stage=couple if yes
|
51
|
-
ask signup re tags:
|
52
|
-
Who are you and who are you looking for tonight? (text back one: w4w, w4m, m4m, or m4w)
|
53
|
-
|
54
|
-
await stage=couple player
|
55
|
-
ask player re code:
|
47
|
+
ask signup re code:
|
56
48
|
Type in your Infatuated Match Card code now.
|
57
|
-
release
|
58
|
-
|
59
|
-
await 1 stage=coded alpha and 1 stage=coded beta with matching code
|
60
|
-
release alpha as alpha
|
61
|
-
release beta as beta
|
62
|
-
|
63
|
-
await 1 w4w alpha and 1 w4w beta
|
64
|
-
release alpha as alpha
|
65
|
-
release beta as beta
|
66
|
-
|
67
|
-
await 1 w4m alpha and 1 m4w beta
|
68
|
-
release alpha as alpha
|
69
|
-
release beta as beta
|
70
|
-
|
71
|
-
await 1 m4m alpha and 1 m4m beta
|
72
|
-
release alpha as alpha
|
73
|
-
release beta as beta
|
74
|
-
|
75
|
-
await 1 m4w alpha and 1 w4m beta
|
76
|
-
release alpha as alpha
|
77
|
-
release beta as beta
|
49
|
+
release signup as coded
|
78
50
|
|
79
|
-
await 1
|
80
|
-
tell
|
51
|
+
await 1 coded alpha and 1 coded beta with matching code
|
52
|
+
tell alpha: You are alpha |her.first_name|, beta is |buddy.first_name|
|
53
|
+
tell beta: You are beta |her.first_name|, alpha is |buddy.first_name|
|
81
54
|
XXXX
|
82
55
|
|
83
56
|
|
@@ -88,18 +61,17 @@ XXXX
|
|
88
61
|
ping f, :id => 'Jon', :tags => ['new']
|
89
62
|
asked 'Sara', /Thanks/
|
90
63
|
says 'Sara', 'Sara'
|
91
|
-
|
92
|
-
says 'Sara', 'y'
|
64
|
+
|
93
65
|
asked 'Jon', /Thanks/
|
94
66
|
says 'Jon', 'Jon'
|
67
|
+
|
68
|
+
asked 'Sara', /Match Card/
|
95
69
|
asked 'Jon', /Match Card/
|
96
|
-
says 'Jon', 'y'
|
97
|
-
asked 'Sara', /code now/
|
98
70
|
says 'Sara', 'xyzzy'
|
99
|
-
asked 'Jon', /code now/
|
100
71
|
says 'Jon', 'xyZZy '
|
101
|
-
|
102
|
-
told '
|
72
|
+
|
73
|
+
told 'Sara', /alpha Sara, beta is Jon/
|
74
|
+
told 'Jon', /beta Jon, alpha is Sara/
|
103
75
|
end
|
104
76
|
end
|
105
77
|
|