aromancer 0.0.7 → 0.0.9

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.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  =begin
2
4
 
3
5
  storage.rb
@@ -12,28 +14,127 @@ module Aromancer
12
14
  class Storage
13
15
  include Singleton
14
16
 
15
- DEFAULT_SERVER = "http://127.0.0.1"
17
+ VALID_KEYS = [
18
+ :arena,
19
+ :last_error,
20
+ :legends,
21
+ :player,
22
+ :preference_debug,
23
+ :preference_force_ssl,
24
+ :preference_hide_sentences,
25
+ :preference_hide_stream,
26
+ :server_url_host,
27
+ :server_url_port,
28
+ :server_url_scheme,
29
+ :signed_out_flag,
30
+ :stream,
31
+ :websocket_path,
32
+ :websocket_scheme
33
+ ]
34
+
35
+ PERSISTED_KEYS = [
36
+ :last_error,
37
+ :player,
38
+ :preference_debug,
39
+ :preference_force_ssl,
40
+ :preference_hide_sentences,
41
+ :preference_hide_stream,
42
+ :server_url_host,
43
+ :server_url_port,
44
+ :server_url_scheme,
45
+ :websocket_path,
46
+ :websocket_scheme
47
+ ]
48
+
49
+ URI_KEYS = [
50
+ :scheme,
51
+ :host,
52
+ :port
53
+ ]
54
+
55
+ DEFAULT_PREFERENCES = {
56
+ preference_debug: false,
57
+ preference_force_ssl: false,
58
+ preference_hide_sentences: true,
59
+ preference_hide_stream: true,
60
+ }
16
61
 
17
- attr_accessor :storage_open, :cache
62
+ DEFAULT_SERVER_URL = :"http://127.0.0.1:3000".to_s
63
+
64
+ attr_accessor :storage_open, :cache, :clear_flag, :parser_error
18
65
 
19
66
  def initialize
67
+ reload!
68
+ end
69
+
70
+ def ensure_default_preferences_exist
71
+ DEFAULT_PREFERENCES.each{|d_key, d_value|
72
+ current_value = get_key(d_key)
73
+ if current_value.nil? || ![TrueClass, FalseClass].include?(current_value.class)
74
+ set_key(d_key.to_s, d_value)
75
+ end
76
+ }
77
+ end
78
+
79
+ def reload!
80
+ @storage_open = false
81
+ @clear_flag = false
82
+ @parser_error = nil
20
83
  clear_cache!
21
- FileUtils.mkdir_p(Aromancer.home_directory)
84
+ Aromancer.configure_home
22
85
  end
23
86
 
24
87
  def clear_cache!
88
+ if @storage_open
89
+ @clear_flag = true
90
+ return
91
+ end
92
+ @clear_flag = false
25
93
  @storage_open = false
26
- @cache = {}
94
+
95
+ @cache = {} # clear'd
96
+ end
97
+
98
+ def self.snapshot_config
99
+ current_config = {}
100
+
101
+ PERSISTED_KEYS.each{|p_key|
102
+ current_config[p_key] = Aromancer::Storage.instance.get_key(p_key)
103
+ }
104
+
105
+ current_config
106
+ end
107
+
108
+ def self.valid_config?(config)
109
+ return false unless config.kind_of?(Hash)
110
+
111
+ config.keys.all?{|k| PERSISTED_KEYS.include?(k.to_sym)}
112
+ end
113
+
114
+ def self.restore_config(config)
115
+ return nil unless valid_config?(config)
116
+ PERSISTED_KEYS.each{|p_key|
117
+ Aromancer::Storage.instance.set_key(p_key, config[p_key])
118
+ }
119
+ end
120
+
121
+ def self.recreate!
122
+ current_config = snapshot_config
123
+ FileUtils.rm_rf(storage_filepath)
124
+ Aromancer::Storage.instance.reload!
125
+ restore_config(current_config)
27
126
  end
28
127
 
29
128
  def self.storage_filepath
30
- filepath = File.join(Aromancer.home_directory, "storage.json")
129
+ filepath = File.join(Aromancer.home_directory, "v#{Aromancer::VERSION}.json")
31
130
 
32
131
  # create storage file if not present
33
132
  unless File.exist?(filepath)
34
133
  File.open(filepath, "w+") do |f|
35
- f.write({version: Aromancer::VERSION, created: Time.now}.to_json)
134
+ f.write({created_at: Time.now}.to_json)
36
135
  end
136
+ else
137
+
37
138
  end
38
139
 
39
140
  filepath
@@ -50,33 +151,33 @@ module Aromancer
50
151
 
51
152
  def self.get_preference(preference, default: nil)
52
153
  p_key = "preference_#{preference}"
53
- p = instance.get_key(p_key)
54
- if p.nil?
55
- instance.set_key(p_key, default)
56
- return instance.get_key(p_key)
154
+ pref = Aromancer::Storage.instance.get_key(p_key)
155
+ if pref.nil? && !default.nil?
156
+ Aromancer::Storage.instance.set_key(p_key, default)
157
+ pref = Aromancer::Storage.instance.get_key(p_key)
57
158
  end
58
- p
159
+ pref
59
160
  end
60
161
 
61
162
  def self.set_preference(preference, value)
62
163
  p_key = "preference_#{preference}"
63
- instance.set_key(p_key, value)
164
+ Aromancer::Storage.instance.set_key(p_key, value)
64
165
  end
65
166
 
66
167
  def self.toggle_preference(key)
67
- v = get_preference(key)
168
+ v = get_preference(key, default: DEFAULT_PREFERENCES["preference_#{key}"])
68
169
  set_preference(key, !v)
69
170
  end
70
171
 
71
172
  def self.toggle_force_ssl
72
173
  toggle_preference(:force_ssl)
73
174
  v = get_preference(:force_ssl)
74
- self.instance.set_key(:server_url_scheme, "http#{v ? :s : ""}")
75
- self.instance.set_key(:websocket_scheme, "ws#{v ? :s : ""}")
175
+ Aromancer::Storage.set_key(:server_url_scheme, "http#{v ? :s : ""}")
176
+ Aromancer::Storage.set_key(:websocket_scheme, "ws#{v ? :s : ""}")
76
177
  end
77
178
 
78
179
  def self.set_signed_out_flag(flag)
79
- Aromancer::Storage.instance.set_key(:signed_out_flag, flag)
180
+ instance.set_key(:signed_out_flag, flag)
80
181
  end
81
182
 
82
183
  def self.get_signed_out_flag
@@ -84,7 +185,7 @@ module Aromancer
84
185
  end
85
186
 
86
187
  def self.set_player(player_hash)
87
- Aromancer::Storage.instance.set_key(:player, player_hash)
188
+ instance.set_key(:player, player_hash)
88
189
  end
89
190
 
90
191
  def self.get_player
@@ -92,7 +193,7 @@ module Aromancer
92
193
  end
93
194
 
94
195
  def self.set_legends(legends_array)
95
- Aromancer::Storage.instance.set_key(:legends, legends_array)
196
+ instance.set_key(:legends, legends_array)
96
197
  end
97
198
 
98
199
  def self.get_legends
@@ -100,7 +201,8 @@ module Aromancer
100
201
  end
101
202
 
102
203
  def self.set_arena(arena_hash)
103
- Aromancer::Storage.instance.set_key(:arena, arena_hash)
204
+ instance.set_key(:arena, arena_hash)
205
+ Aromancer::UnixDom.render_arena
104
206
  end
105
207
 
106
208
  def self.get_arena
@@ -108,7 +210,7 @@ module Aromancer
108
210
  end
109
211
 
110
212
  def self.set_stream(stream_array)
111
- Aromancer::Storage.instance.set_key(:stream, stream_array)
213
+ instance.set_key(:stream, stream_array)
112
214
  end
113
215
 
114
216
  def self.get_stream
@@ -116,33 +218,26 @@ module Aromancer
116
218
  end
117
219
 
118
220
  def self.set_last_error(error_hash)
119
- Aromancer::Storage.instance.set_key(:last_error, error_hash)
221
+ instance.set_key(:last_error, error_hash)
120
222
  end
121
223
 
122
224
  def self.get_last_error
123
225
  Aromancer::Storage.instance.get_key(:last_error)
124
226
  end
125
227
 
126
- URI_KEYS = [
127
- :scheme,
128
- :host,
129
- :port
130
- ]
131
-
132
228
  def self.set_server_url(server_url)
133
229
  uri = URI.parse(server_url)
134
230
  if uri.kind_of?(URI::HTTP) || uri.kind_of?(URI::HTTPS)
135
231
  URI_KEYS.each{|k|
136
- uri.kind_of?(URI::HTTP) && get_preference(:force_ssl) ? toggle_force_ssl : nil
137
- Aromancer::Storage.instance.set_key("server_url_#{k}", uri.select(k).first)
232
+ instance.set_key("server_url_#{k}", uri.select(k).first)
138
233
  }
139
234
  elsif get_server_url.nil?
140
- set_server_url(DEFAULT_SERVER)
235
+ set_server_url(DEFAULT_SERVER_URL)
141
236
  end
142
237
  end
143
238
 
144
239
  def self.get_server_url
145
- set_server_url(DEFAULT_SERVER) if URI_KEYS.all?{|k| Aromancer::Storage.instance.get_key("server_url_#{k}").nil?}
240
+ set_server_url(DEFAULT_SERVER_URL) if URI_KEYS.all?{|k| Aromancer::Storage.instance.get_key("server_url_#{k}").nil?}
146
241
  URI.parse(URI_KEYS.map{|k|
147
242
  c = Aromancer::Storage.instance.get_key("server_url_#{k}")
148
243
  case k
@@ -159,12 +254,12 @@ module Aromancer
159
254
  def self.get_websocket_url
160
255
  # default scheme is ws
161
256
  w_scheme = Aromancer::Storage.instance.get_key(:websocket_scheme)
162
- Aromancer::Storage.instance.set_key(:websocket_scheme, :ws) if w_scheme.nil?
257
+ instance.set_key(:websocket_scheme, :ws) if w_scheme.nil?
163
258
  w_scheme = Aromancer::Storage.instance.get_key(:websocket_scheme)
164
259
 
165
260
  # default path is broadcast
166
261
  w_path = Aromancer::Storage.instance.get_key(:websocket_path)
167
- Aromancer::Storage.instance.set_key(:websocket_path, :broadcast) if w_path.nil?
262
+ instance.set_key(:websocket_path, :broadcast) if w_path.nil?
168
263
  w_path = Aromancer::Storage.instance.get_key(:websocket_path)
169
264
 
170
265
  # asserts host and port not nil
@@ -176,78 +271,104 @@ module Aromancer
176
271
  end
177
272
 
178
273
  def get_key(key)
179
- key = key.to_s
274
+ Aromancer::Cli.instance.storage_mutex.synchronize do
275
+ key = key.to_s
180
276
 
181
- # ensure default for key exists
182
- @cache[key] = {value: nil, persisted: false} unless @cache.keys.include?(key)
277
+ # ensure default for key exists
278
+ @cache[key] = {value: nil, persisted: false} unless @cache.keys.include?(key)
279
+ if false && (@cache[:preference_debug.to_s] || {value: DEFAULT_PREFERENCES[:preference_debug]})[:value]
280
+ Aromancer::Prompt.say("#{__method__} > @cache[#{key}]=#{@cache[key]}")
281
+ end
282
+ # return cache value if storage open or the cache value is persisted
283
+ return @cache[key][:value] if @storage_open || @cache[key][:persisted]
284
+
285
+ # open storage
286
+ @storage_open = true
287
+ storage_contents = {}
288
+ begin
289
+ @parser_error = nil
290
+ # read storage
291
+ storage_contents = JSON.parse(File.read(Aromancer::Storage.storage_filepath, encoding: "UTF-8"))
292
+ rescue StandardError => e
293
+ @storage_open = false
294
+ if @parser_error.nil?
295
+ @parser_error = e
296
+ return get_key(key)
297
+ else
298
+ raise @parser_error
299
+ end
300
+ end
183
301
 
184
- # return cache value if storage open or the cache value is persisted
185
- return @cache[key][:value] if @storage_open || @cache[key][:persisted]
302
+ # only update the cache value if present in storage
303
+ if storage_contents.keys.include?(key)
304
+ @cache[key] = {value: storage_contents[key], persisted: true}
305
+ else
306
+ @cache[key][:persisted] = false
307
+ end
186
308
 
187
- # open storage
188
- @storage_open = true
189
- storage_contents = {}
190
- begin
191
- # read storage
192
- storage_contents = JSON.parse(File.read(Aromancer::Storage.storage_filepath))
193
- rescue StandardError => e
309
+ value = @cache[key][:value]
194
310
  @storage_open = false
195
- FileUtils.rm(Aromancer::Storage.storage_filepath)
196
- return
311
+ clear_cache! if @clear_flag
312
+ return value
197
313
  end
314
+ end
198
315
 
199
- # only update the cache value if present in storage
200
- if storage_contents.keys.include?(key)
201
- @cache[key] = {value: storage_contents[key], persisted: true}
202
- else
316
+ def set_key(key, value)
317
+ Aromancer::Cli.instance.storage_mutex.synchronize do
318
+ key = key.to_s
319
+
320
+ # ensure default for key exists
321
+ @cache[key] = {value: value, persisted: false} unless @cache.keys.include?(key)
322
+
323
+ # assign new cache value and set persisted to false
324
+ @cache[key][:value] = value
203
325
  @cache[key][:persisted] = false
204
- end
205
326
 
206
- @storage_open = false
207
- @cache[key][:value]
208
- end
327
+ if @storage_open && (@cache[:preference_debug.to_s] || {value: DEFAULT_PREFERENCES[:preference_debug]})[:value]
328
+ Aromancer::Prompt.say("#{__method__} > @cache[#{key}]=#{@cache[key]}")
329
+ end
330
+ # return if storage open
331
+ # non-persisted cache values update next cycle
332
+ return if @storage_open
333
+
334
+ # open storage
335
+ @storage_open = true
336
+ storage_contents = {}
337
+ begin
338
+ @parser_error = nil
339
+ # read storage
340
+ storage_contents = JSON.parse(File.read(Aromancer::Storage.storage_filepath, encoding: "UTF-8"))
341
+ rescue StandardError => e
342
+ @storage_open = false
343
+ if @parser_error.nil?
344
+ @parser_error = e
345
+ return get_key(key)
346
+ else
347
+ raise @parser_error
348
+ end
349
+ end
209
350
 
210
- def set_key(key, value)
211
- key = key.to_s
212
-
213
- # ensure default for key exists
214
- @cache[key] = {value: nil, persisted: false} unless @cache.keys.include?(key)
215
-
216
- # assign new cache value and set persisted to false
217
- @cache[key][:value] = value
218
- @cache[key][:persisted] = false
219
-
220
- # return if storage open
221
- # non-persisted cache values update next cycle
222
- return if @storage_open
223
-
224
- # open storage
225
- @storage_open = true
226
- storage_contents = {}
227
- begin
228
- # read storage
229
- storage_contents = JSON.parse(File.read(Aromancer::Storage.storage_filepath))
230
- rescue StandardError => e
231
- @storage_open = false
232
- FileUtils.rm(Aromancer::Storage.storage_filepath)
233
- return
234
- end
351
+ # update storage and cache
352
+ ([key] + @cache.keys.select{|k|
353
+ !@cache[k][:persisted]
354
+ }).each{|k|
355
+ storage_contents[k] = @cache[k][:value]
356
+ @cache[k][:persisted] = true
357
+ }
235
358
 
236
- # update storage and cache
237
- ([key] + @cache.keys.select{|k|
238
- !@cache[k][:persisted]
239
- }).each{|k|
240
- storage_contents[k] = @cache[k][:value]
241
- @cache[k][:persisted] = true
242
- }
359
+ # write storage
360
+ File.open(Aromancer::Storage.storage_filepath, "w+") do |f|
361
+ f.write(storage_contents.to_json)
362
+ end
243
363
 
244
- # write storage
245
- File.open(Aromancer::Storage.storage_filepath, "w+") do |f|
246
- f.write(storage_contents.to_json)
247
- end
364
+ if (@cache[:preference_debug.to_s] || {value: DEFAULT_PREFERENCES[:preference_debug]})[:value]
365
+ Aromancer::Prompt.say("#{__method__} > @cache[#{key}]=#{@cache[key]}")
366
+ end
248
367
 
249
- # close storage
250
- @storage_open = false
368
+ # close storage
369
+ @storage_open = false
370
+ clear_cache! if @clear_flag
371
+ end
251
372
  end
252
373
  end
253
374
  end
@@ -0,0 +1,13 @@
1
+ module Aromancer
2
+ class UnixDom
3
+
4
+ def self.render_arena
5
+ arena = Aromancer::Storage.get_arena
6
+ return unless arena.present?
7
+
8
+ # Aromancer.arena_directory
9
+ # todo:
10
+ end
11
+
12
+ end
13
+ end
@@ -11,5 +11,5 @@
11
11
  =end
12
12
 
13
13
  module Aromancer
14
- VERSION = "0.0.7"
14
+ VERSION = "0.0.9"
15
15
  end
@@ -22,9 +22,18 @@ module Aromancer
22
22
 
23
23
  attr_accessor :socket
24
24
 
25
+ def self.channel_identifier
26
+ {identifier: {channel: :PlayerChannel.to_s, id: Aromancer::Storage.get_player["id"]}.to_json}
27
+ end
28
+
25
29
  def connect
26
- return unless self.socket.nil?
27
- return if Aromancer::Storage.get_player["api_key"].nil?
30
+ if !self.socket.nil? && self.socket.closed?
31
+ disconnect
32
+ end
33
+
34
+ return if !self.socket.nil? ||
35
+ Aromancer::Storage.get_player["api_key"].nil? ||
36
+ Aromancer::Storage.get_player["active_legend_id"].nil?
28
37
 
29
38
  begin
30
39
  self.socket = WebSocket::Client::Simple.connect(Aromancer::Storage.get_websocket_url, {headers: Aromancer::Server.auth_header})
@@ -45,8 +54,10 @@ module Aromancer
45
54
  legend_id = payload["message"]["id"]
46
55
  lid = Aromancer::Storage.get_player&.symbolize_keys[:active_legend_id]
47
56
  if !lid.nil? && lid == legend_id.to_i
57
+ Aromancer::Cli.instance.should_clear_cache = true
58
+ Aromancer::Api.get_legends
48
59
  Aromancer::Api.load_arena
49
- sleep(0.5)
60
+ sleep(1)
50
61
  Aromancer::Cli.instance.start_ui_thread
51
62
  end
52
63
  when :legends
@@ -57,10 +68,7 @@ module Aromancer
57
68
  end
58
69
 
59
70
  self.socket.on :open do
60
- r = {
61
- command: "subscribe",
62
- identifier: {channel: "PlayerChannel"}.to_json
63
- }.to_json
71
+ r = {"command": :subscribe.to_s}.merge(Aromancer::Websocket.channel_identifier).to_json
64
72
  Aromancer::Websocket.instance.socket.send(r)
65
73
  end
66
74
 
@@ -69,7 +77,10 @@ module Aromancer
69
77
  end
70
78
 
71
79
  self.socket.on :error do |e|
72
- puts e.inspect
80
+ if Aromancer::Storage.get_preference(:debug)
81
+ Aromancer::Prompt.say("#{self.class.name} socket.on :error")
82
+ Aromancer::Prompt.say(e.inspect)
83
+ end
73
84
  Aromancer::Websocket.instance.disconnect
74
85
  end
75
86
  end
@@ -78,5 +89,15 @@ module Aromancer
78
89
  self.socket&.close
79
90
  self.socket = nil
80
91
  end
92
+
93
+ # todo: websockets only in-game
94
+ # https://docs.anycable.io/misc/action_cable_protocol#perform-actions
95
+ # def self.set_active_legend_id(id)
96
+ # return if self.instance.socket.nil?
97
+ # r = {"command": :message.to_s}.merge(Aromancer::Websocket.channel_identifier).merge({
98
+ # data: {action: :player.to_s, active_legend_id: id}.to_json
99
+ # }).to_json
100
+ # self.instance.socket.send(r)
101
+ # end
81
102
  end
82
103
  end