aromancer 0.0.5 → 0.0.7
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.
- checksums.yaml +4 -4
- data/README.md +26 -5
- data/aromancer.gemspec +2 -2
- data/bin/aromancer +5 -1
- data/checksums/aromancer-0.0.6.gem.sha512 +1 -0
- data/checksums/aromancer-0.0.7.gem.sha512 +1 -0
- data/lib/aromancer/api.rb +58 -30
- data/lib/aromancer/prompt.rb +18 -2
- data/lib/aromancer/routes.rb +425 -356
- data/lib/aromancer/server.rb +41 -35
- data/lib/aromancer/storage.rb +16 -9
- data/lib/aromancer/version.rb +1 -1
- data/lib/aromancer/websocket.rb +26 -9
- data/lib/aromancer.rb +105 -28
- data/locale/en.yml +16 -7
- metadata +3 -1
data/lib/aromancer/server.rb
CHANGED
|
@@ -14,8 +14,6 @@ module Aromancer
|
|
|
14
14
|
class Server
|
|
15
15
|
include Singleton
|
|
16
16
|
|
|
17
|
-
DEVELOP_SERVER_URL = "http://localhost:3000"
|
|
18
|
-
|
|
19
17
|
HEADERS = { "Content-Type": "application/json" }
|
|
20
18
|
|
|
21
19
|
class InternalError
|
|
@@ -35,10 +33,8 @@ module Aromancer
|
|
|
35
33
|
end
|
|
36
34
|
end
|
|
37
35
|
|
|
38
|
-
def self.
|
|
39
|
-
{
|
|
40
|
-
api_key: Aromancer::Storage.get_player["api_key"]
|
|
41
|
-
}
|
|
36
|
+
def self.auth_header
|
|
37
|
+
{"Authorization": "Bearer #{Aromancer::Storage.get_player["api_key"]}"}
|
|
42
38
|
end
|
|
43
39
|
|
|
44
40
|
def self.sign_in(email_address, password)
|
|
@@ -78,8 +74,7 @@ module Aromancer
|
|
|
78
74
|
begin
|
|
79
75
|
Faraday.new(
|
|
80
76
|
url: Aromancer::Storage.get_server_url,
|
|
81
|
-
headers: HEADERS,
|
|
82
|
-
params: api_key_param
|
|
77
|
+
headers: HEADERS.merge(auth_header),
|
|
83
78
|
).delete("/session")
|
|
84
79
|
rescue StandardError => e
|
|
85
80
|
InternalError.build(e)
|
|
@@ -90,8 +85,8 @@ module Aromancer
|
|
|
90
85
|
begin
|
|
91
86
|
Faraday.new(
|
|
92
87
|
url: Aromancer::Storage.get_server_url,
|
|
93
|
-
headers: HEADERS,
|
|
94
|
-
params: params
|
|
88
|
+
headers: HEADERS.merge(auth_header),
|
|
89
|
+
params: params
|
|
95
90
|
).post("/legends")
|
|
96
91
|
rescue StandardError => e
|
|
97
92
|
InternalError.build(e)
|
|
@@ -102,20 +97,30 @@ module Aromancer
|
|
|
102
97
|
begin
|
|
103
98
|
Faraday.new(
|
|
104
99
|
url: Aromancer::Storage.get_server_url,
|
|
105
|
-
headers: HEADERS,
|
|
106
|
-
params: api_key_param
|
|
100
|
+
headers: HEADERS.merge(auth_header),
|
|
107
101
|
).get("/legends")
|
|
108
102
|
rescue StandardError => e
|
|
109
103
|
InternalError.build(e)
|
|
110
104
|
end
|
|
111
105
|
end
|
|
112
106
|
|
|
107
|
+
def self.find_legends
|
|
108
|
+
begin
|
|
109
|
+
Faraday.new(
|
|
110
|
+
url: Aromancer::Storage.get_server_url,
|
|
111
|
+
headers: HEADERS.merge(auth_header),
|
|
112
|
+
).get("/legends/find")
|
|
113
|
+
rescue StandardError => e
|
|
114
|
+
InternalError.build(e)
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
113
118
|
def self.update_player(params)
|
|
114
119
|
begin
|
|
115
120
|
Faraday.new(
|
|
116
121
|
url: Aromancer::Storage.get_server_url,
|
|
117
|
-
headers: HEADERS,
|
|
118
|
-
params: params
|
|
122
|
+
headers: HEADERS.merge(auth_header),
|
|
123
|
+
params: params
|
|
119
124
|
).put("/players/#{Aromancer::Storage.get_player["id"]}")
|
|
120
125
|
rescue StandardError => e
|
|
121
126
|
InternalError.build(e)
|
|
@@ -123,67 +128,68 @@ module Aromancer
|
|
|
123
128
|
end
|
|
124
129
|
|
|
125
130
|
def self.get_arena
|
|
126
|
-
legend_id = Aromancer::Storage.get_player["active_legend_id"]
|
|
131
|
+
legend_id = (Aromancer::Storage.get_player || {})["active_legend_id"]
|
|
132
|
+
return InternalError.build(StandardError.new("no active legend")) if legend_id.nil?
|
|
127
133
|
|
|
128
134
|
begin
|
|
129
135
|
Faraday.new(
|
|
130
136
|
url: Aromancer::Storage.get_server_url,
|
|
131
|
-
headers: HEADERS,
|
|
132
|
-
params: api_key_param
|
|
137
|
+
headers: HEADERS.merge(auth_header),
|
|
133
138
|
).get("/legends/#{legend_id}/arena")
|
|
134
139
|
rescue StandardError => e
|
|
135
140
|
InternalError.build(e)
|
|
136
141
|
end
|
|
137
142
|
end
|
|
138
143
|
|
|
139
|
-
def self.get_stream
|
|
140
|
-
legend_id = Aromancer::Storage.get_player["active_legend_id"]
|
|
144
|
+
def self.get_stream(count = nil)
|
|
145
|
+
legend_id = (Aromancer::Storage.get_player || {})["active_legend_id"]
|
|
146
|
+
return InternalError.build(StandardError.new("no active legend")) if legend_id.nil?
|
|
141
147
|
|
|
142
148
|
begin
|
|
143
149
|
Faraday.new(
|
|
144
150
|
url: Aromancer::Storage.get_server_url,
|
|
145
|
-
headers: HEADERS,
|
|
146
|
-
|
|
147
|
-
).get("/legends/#{legend_id}/stream")
|
|
151
|
+
headers: HEADERS.merge(auth_header),
|
|
152
|
+
).get("/legends/#{legend_id}/stream?count=#{count || nil}")
|
|
148
153
|
rescue StandardError => e
|
|
149
154
|
InternalError.build(e)
|
|
150
155
|
end
|
|
151
156
|
end
|
|
152
157
|
|
|
153
158
|
def self.get_word_possibilities(selected_word_id)
|
|
154
|
-
legend_id = Aromancer::Storage.get_player["active_legend_id"]
|
|
159
|
+
legend_id = (Aromancer::Storage.get_player || {})["active_legend_id"]
|
|
160
|
+
return InternalError.build(StandardError.new("no active legend")) if legend_id.nil?
|
|
161
|
+
|
|
155
162
|
begin
|
|
156
163
|
Faraday.new(
|
|
157
164
|
url: Aromancer::Storage.get_server_url,
|
|
158
|
-
headers: HEADERS,
|
|
159
|
-
params: api_key_param
|
|
165
|
+
headers: HEADERS.merge(auth_header),
|
|
160
166
|
).get("/legends/#{legend_id}/words/#{selected_word_id}/possibilities")
|
|
161
167
|
rescue StandardError => e
|
|
162
168
|
InternalError.build(e)
|
|
163
169
|
end
|
|
164
170
|
end
|
|
165
171
|
|
|
166
|
-
def self.
|
|
167
|
-
legend_id = Aromancer::Storage.get_player["active_legend_id"]
|
|
172
|
+
def self.submit_turn(request_uuid, params = {})
|
|
173
|
+
legend_id = (Aromancer::Storage.get_player || {})["active_legend_id"]
|
|
174
|
+
return InternalError.build(StandardError.new("no active legend")) if legend_id.nil?
|
|
175
|
+
|
|
168
176
|
begin
|
|
169
177
|
Faraday.new(
|
|
170
178
|
url: Aromancer::Storage.get_server_url,
|
|
171
|
-
headers: HEADERS,
|
|
172
|
-
params: params
|
|
173
|
-
).
|
|
179
|
+
headers: HEADERS.merge(auth_header),
|
|
180
|
+
params: params
|
|
181
|
+
).put("/legends/#{legend_id}/arena/#{request_uuid}")
|
|
174
182
|
rescue StandardError => e
|
|
175
183
|
InternalError.build(e)
|
|
176
184
|
end
|
|
177
185
|
end
|
|
178
186
|
|
|
179
|
-
def self.
|
|
180
|
-
legend_id = Aromancer::Storage.get_player["active_legend_id"]
|
|
187
|
+
def self.load_rules
|
|
181
188
|
begin
|
|
182
189
|
Faraday.new(
|
|
183
190
|
url: Aromancer::Storage.get_server_url,
|
|
184
|
-
headers: HEADERS,
|
|
185
|
-
|
|
186
|
-
).put("/legends/#{legend_id}/arena")
|
|
191
|
+
headers: HEADERS.merge(auth_header),
|
|
192
|
+
).get("/")
|
|
187
193
|
rescue StandardError => e
|
|
188
194
|
InternalError.build(e)
|
|
189
195
|
end
|
data/lib/aromancer/storage.rb
CHANGED
|
@@ -12,6 +12,8 @@ module Aromancer
|
|
|
12
12
|
class Storage
|
|
13
13
|
include Singleton
|
|
14
14
|
|
|
15
|
+
DEFAULT_SERVER = "http://127.0.0.1"
|
|
16
|
+
|
|
15
17
|
attr_accessor :storage_open, :cache
|
|
16
18
|
|
|
17
19
|
def initialize
|
|
@@ -46,7 +48,7 @@ module Aromancer
|
|
|
46
48
|
return Time.now.to_i
|
|
47
49
|
end
|
|
48
50
|
|
|
49
|
-
def self.get_preference(preference, default:
|
|
51
|
+
def self.get_preference(preference, default: nil)
|
|
50
52
|
p_key = "preference_#{preference}"
|
|
51
53
|
p = instance.get_key(p_key)
|
|
52
54
|
if p.nil?
|
|
@@ -61,8 +63,13 @@ module Aromancer
|
|
|
61
63
|
instance.set_key(p_key, value)
|
|
62
64
|
end
|
|
63
65
|
|
|
66
|
+
def self.toggle_preference(key)
|
|
67
|
+
v = get_preference(key)
|
|
68
|
+
set_preference(key, !v)
|
|
69
|
+
end
|
|
70
|
+
|
|
64
71
|
def self.toggle_force_ssl
|
|
65
|
-
|
|
72
|
+
toggle_preference(:force_ssl)
|
|
66
73
|
v = get_preference(:force_ssl)
|
|
67
74
|
self.instance.set_key(:server_url_scheme, "http#{v ? :s : ""}")
|
|
68
75
|
self.instance.set_key(:websocket_scheme, "ws#{v ? :s : ""}")
|
|
@@ -124,17 +131,18 @@ module Aromancer
|
|
|
124
131
|
|
|
125
132
|
def self.set_server_url(server_url)
|
|
126
133
|
uri = URI.parse(server_url)
|
|
127
|
-
if uri.kind_of?(URI::HTTP)
|
|
134
|
+
if uri.kind_of?(URI::HTTP) || uri.kind_of?(URI::HTTPS)
|
|
128
135
|
URI_KEYS.each{|k|
|
|
136
|
+
uri.kind_of?(URI::HTTP) && get_preference(:force_ssl) ? toggle_force_ssl : nil
|
|
129
137
|
Aromancer::Storage.instance.set_key("server_url_#{k}", uri.select(k).first)
|
|
130
138
|
}
|
|
131
|
-
|
|
132
|
-
set_server_url(
|
|
139
|
+
elsif get_server_url.nil?
|
|
140
|
+
set_server_url(DEFAULT_SERVER)
|
|
133
141
|
end
|
|
134
142
|
end
|
|
135
143
|
|
|
136
144
|
def self.get_server_url
|
|
137
|
-
set_server_url(
|
|
145
|
+
set_server_url(DEFAULT_SERVER) if URI_KEYS.all?{|k| Aromancer::Storage.instance.get_key("server_url_#{k}").nil?}
|
|
138
146
|
URI.parse(URI_KEYS.map{|k|
|
|
139
147
|
c = Aromancer::Storage.instance.get_key("server_url_#{k}")
|
|
140
148
|
case k
|
|
@@ -187,16 +195,15 @@ module Aromancer
|
|
|
187
195
|
FileUtils.rm(Aromancer::Storage.storage_filepath)
|
|
188
196
|
return
|
|
189
197
|
end
|
|
190
|
-
@storage_open = false
|
|
191
198
|
|
|
192
199
|
# only update the cache value if present in storage
|
|
193
200
|
if storage_contents.keys.include?(key)
|
|
194
|
-
@cache[key]
|
|
195
|
-
@cache[key][:persisted] = true
|
|
201
|
+
@cache[key] = {value: storage_contents[key], persisted: true}
|
|
196
202
|
else
|
|
197
203
|
@cache[key][:persisted] = false
|
|
198
204
|
end
|
|
199
205
|
|
|
206
|
+
@storage_open = false
|
|
200
207
|
@cache[key][:value]
|
|
201
208
|
end
|
|
202
209
|
|
data/lib/aromancer/version.rb
CHANGED
data/lib/aromancer/websocket.rb
CHANGED
|
@@ -16,14 +16,22 @@ module Aromancer
|
|
|
16
16
|
|
|
17
17
|
TYPES = [
|
|
18
18
|
:arena,
|
|
19
|
-
:
|
|
19
|
+
:legends,
|
|
20
|
+
:player # todo: not used
|
|
20
21
|
]
|
|
21
22
|
|
|
22
23
|
attr_accessor :socket
|
|
23
24
|
|
|
24
|
-
def connect
|
|
25
|
+
def connect
|
|
25
26
|
return unless self.socket.nil?
|
|
26
|
-
|
|
27
|
+
return if Aromancer::Storage.get_player["api_key"].nil?
|
|
28
|
+
|
|
29
|
+
begin
|
|
30
|
+
self.socket = WebSocket::Client::Simple.connect(Aromancer::Storage.get_websocket_url, {headers: Aromancer::Server.auth_header})
|
|
31
|
+
rescue Socket::ResolutionError => e
|
|
32
|
+
disconnect
|
|
33
|
+
return
|
|
34
|
+
end
|
|
27
35
|
self.socket.on :message do |msg|
|
|
28
36
|
payload = JSON.parse(msg.data) rescue msg.data
|
|
29
37
|
if !payload.nil? &&
|
|
@@ -32,10 +40,18 @@ module Aromancer
|
|
|
32
40
|
!payload["message"]["type"].nil? &&
|
|
33
41
|
TYPES.include?(payload["message"]["type"].to_sym)
|
|
34
42
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
Aromancer::
|
|
43
|
+
case payload["message"]["type"].to_sym
|
|
44
|
+
when :arena
|
|
45
|
+
legend_id = payload["message"]["id"]
|
|
46
|
+
lid = Aromancer::Storage.get_player&.symbolize_keys[:active_legend_id]
|
|
47
|
+
if !lid.nil? && lid == legend_id.to_i
|
|
48
|
+
Aromancer::Api.load_arena
|
|
49
|
+
sleep(0.5)
|
|
50
|
+
Aromancer::Cli.instance.start_ui_thread
|
|
51
|
+
end
|
|
52
|
+
when :legends
|
|
53
|
+
Aromancer::Api.get_legends
|
|
54
|
+
when :player
|
|
39
55
|
end
|
|
40
56
|
end
|
|
41
57
|
end
|
|
@@ -43,7 +59,7 @@ module Aromancer
|
|
|
43
59
|
self.socket.on :open do
|
|
44
60
|
r = {
|
|
45
61
|
command: "subscribe",
|
|
46
|
-
identifier: {channel: "PlayerChannel"
|
|
62
|
+
identifier: {channel: "PlayerChannel"}.to_json
|
|
47
63
|
}.to_json
|
|
48
64
|
Aromancer::Websocket.instance.socket.send(r)
|
|
49
65
|
end
|
|
@@ -59,7 +75,8 @@ module Aromancer
|
|
|
59
75
|
end
|
|
60
76
|
|
|
61
77
|
def disconnect
|
|
62
|
-
self.socket
|
|
78
|
+
self.socket&.close
|
|
79
|
+
self.socket = nil
|
|
63
80
|
end
|
|
64
81
|
end
|
|
65
82
|
end
|
data/lib/aromancer.rb
CHANGED
|
@@ -14,19 +14,51 @@ require_relative :reiquire.to_s
|
|
|
14
14
|
Reiquire::aromancer
|
|
15
15
|
|
|
16
16
|
module Aromancer
|
|
17
|
-
THROTTLE_MS = 0.
|
|
17
|
+
THROTTLE_MS = 0.1
|
|
18
|
+
ERROR_EXPIRATION = 7.77.to_f
|
|
18
19
|
FONT = TTY::Font.new(:standard)
|
|
20
|
+
DATE_FORMAT = "%A %d %b %Y %I:%M:%S %p"
|
|
21
|
+
TIME_FORMAT = "%I:%M:%S %p"
|
|
22
|
+
|
|
23
|
+
UNICODE = {
|
|
24
|
+
close: "\u2A2F",
|
|
25
|
+
check: "\u2713"
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
class Serve
|
|
29
|
+
def self.run
|
|
30
|
+
unless Dir.exist?("#{Aromancer.to_s.downcase}_serve")
|
|
31
|
+
system("git clone git@github.com:arowmancy/aromancer_serve.git")
|
|
32
|
+
end
|
|
33
|
+
FileUtils.chdir :aromancer_serve.to_s do
|
|
34
|
+
system("bin/setup")
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
19
38
|
|
|
20
39
|
# instance runs on main thread
|
|
21
40
|
class Cli
|
|
22
41
|
include Singleton
|
|
23
42
|
|
|
24
|
-
attr_accessor :ui_thread, :ws_thread, :busy, :last_render
|
|
43
|
+
attr_accessor :ui_thread, :ws_thread, :busy, :ws_busy, :last_render, :error_timeout
|
|
25
44
|
|
|
26
45
|
# user entry point
|
|
27
46
|
def self.run
|
|
47
|
+
# ensure preferences exist
|
|
48
|
+
Aromancer::Storage.get_preference(:debug, default: false)
|
|
49
|
+
Aromancer::Storage.get_preference(:force_ssl, default: true)
|
|
50
|
+
Aromancer::Storage.get_preference(:hide_sentences, default: true)
|
|
51
|
+
Aromancer::Storage.get_preference(:hide_stream, default: true)
|
|
52
|
+
|
|
53
|
+
self.instance.last_render = 0
|
|
54
|
+
self.instance.error_timeout = Time.now.to_i
|
|
55
|
+
|
|
56
|
+
# load player on-start
|
|
57
|
+
Aromancer::Api.set_active_legend_id(nil) unless Aromancer::Storage.get_player.nil?
|
|
58
|
+
|
|
28
59
|
Thread.main[:route] = :authentication
|
|
29
|
-
|
|
60
|
+
Thread.main[:menu_runners] = {}
|
|
61
|
+
Thread.main[:menu_options] = {}
|
|
30
62
|
Aromancer::Prompt.say(I18n.t("shared.welcome", version: Aromancer::VERSION))
|
|
31
63
|
Aromancer::Prompt.say(I18n.t("shared.server_url", url: Aromancer::Storage::get_server_url))
|
|
32
64
|
self.instance.start_ui_thread
|
|
@@ -35,70 +67,79 @@ module Aromancer
|
|
|
35
67
|
begin
|
|
36
68
|
self.instance.ui_thread.join
|
|
37
69
|
rescue NoMethodError => e
|
|
70
|
+
if Aromancer::Storage.get_preference(:debug)
|
|
71
|
+
Aromancer::Prompt.say(I18n.t("shared.last_error"))
|
|
72
|
+
Aromancer::Prompt.say(JSON.pretty_generate(e[:body.to_s]))
|
|
73
|
+
Aromancer::Prompt.say("sleeping 5 on main thread...")
|
|
74
|
+
sleep(5)
|
|
75
|
+
end
|
|
38
76
|
self.instance.start_ui_thread
|
|
77
|
+
self.instance.start_ws_thread
|
|
39
78
|
sleep(1)
|
|
40
79
|
rescue Interrupt => e
|
|
80
|
+
Aromancer::Prompt.say("interrupt on main thread...exiting immediately.")
|
|
41
81
|
exit
|
|
42
82
|
end
|
|
43
83
|
end
|
|
44
84
|
end
|
|
45
85
|
|
|
46
|
-
def
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
# end
|
|
54
|
-
# end
|
|
55
|
-
# }.join
|
|
56
|
-
return
|
|
57
|
-
end
|
|
86
|
+
def get_view(view_key)
|
|
87
|
+
Thread.main[:menu_options][view_key.to_sym]
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def start_ui_thread(force = false)
|
|
91
|
+
return if (@busy || Time.now - @last_render < 2.0) && !force
|
|
92
|
+
|
|
58
93
|
@busy = true
|
|
59
94
|
self.ui_thread&.exit
|
|
60
95
|
self.ui_thread&.kill
|
|
61
|
-
Thread.main[:
|
|
96
|
+
Thread.main[:menu_runners] = {}
|
|
97
|
+
Thread.main[:menu_options] = {}
|
|
62
98
|
Aromancer::Prompt.instance.reload!
|
|
63
99
|
self.ui_thread = Thread.new do
|
|
64
100
|
loop do
|
|
65
|
-
|
|
66
|
-
|
|
101
|
+
menu_options = Thread.main[:menu_options][Thread.main[:route]]
|
|
102
|
+
menu_runners = Thread.main[:menu_runners][Thread.main[:route]]
|
|
103
|
+
unless menu_options.nil? || menu_runners.nil?
|
|
67
104
|
Aromancer::Routes.resume
|
|
105
|
+
Aromancer.print_hud
|
|
68
106
|
sleep(THROTTLE_MS)
|
|
69
|
-
v = Aromancer::Prompt.p.select("",
|
|
70
|
-
runners =
|
|
71
|
-
runners =
|
|
107
|
+
v = Aromancer::Prompt.p.select("", menu_options, show_help: :always, cycle: true, per_page: 11)
|
|
108
|
+
runners = menu_runners.select{|r| r[:value] == v}
|
|
109
|
+
runners = menu_runners.select{|r| r[:value].nil?} if runners.empty?
|
|
72
110
|
|
|
73
111
|
if runners.any?
|
|
74
112
|
r = runners.first
|
|
75
113
|
r[:proc].call(v)
|
|
76
|
-
else
|
|
77
|
-
exit
|
|
78
114
|
end
|
|
115
|
+
|
|
79
116
|
else
|
|
80
117
|
Aromancer::Routes.resume
|
|
81
118
|
end
|
|
82
119
|
Aromancer::Cli.instance.busy = false
|
|
83
120
|
Aromancer::Cli.instance.last_render = Time.now
|
|
84
|
-
|
|
121
|
+
sleep(THROTTLE_MS)
|
|
85
122
|
end
|
|
86
123
|
end
|
|
87
124
|
end
|
|
88
125
|
|
|
89
126
|
def start_ws_thread
|
|
127
|
+
return if @ws_busy
|
|
128
|
+
@ws_busy = true
|
|
90
129
|
self.ws_thread.kill unless self.ws_thread.nil?
|
|
91
130
|
self.ws_thread = Thread.new do
|
|
131
|
+
Aromancer::Websocket.instance.disconnect
|
|
92
132
|
loop do
|
|
93
133
|
player = Aromancer::Storage.get_player
|
|
94
134
|
if player.nil?
|
|
135
|
+
@ws_busy = true
|
|
95
136
|
Aromancer::Websocket.instance.disconnect
|
|
96
137
|
elsif !player["api_key"].nil?
|
|
97
138
|
# attempt websocket connection
|
|
98
|
-
|
|
99
|
-
Aromancer::Websocket.instance.connect
|
|
139
|
+
@ws_busy = true
|
|
140
|
+
Aromancer::Websocket.instance.connect
|
|
100
141
|
end
|
|
101
|
-
|
|
142
|
+
@ws_busy = false
|
|
102
143
|
sleep(4)
|
|
103
144
|
end
|
|
104
145
|
end
|
|
@@ -114,9 +155,38 @@ module Aromancer
|
|
|
114
155
|
"#{`echo $HOME`.strip}/.aromancer"
|
|
115
156
|
end
|
|
116
157
|
|
|
158
|
+
def self.date_display(raw)
|
|
159
|
+
DateTime.parse(raw)&.strftime(Aromancer::DATE_FORMAT).downcase.gsub(" ", "_")
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def self.time_display(raw)
|
|
163
|
+
DateTime.parse(raw)&.strftime(Aromancer::TIME_FORMAT).downcase.gsub(" ", "_")
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def self.print_hud
|
|
167
|
+
print_last_error
|
|
168
|
+
websocket_status = "#{Aromancer::Storage.instance.get_key(:websocket_scheme)}: #{Aromancer::Websocket.instance.socket.nil? ? UNICODE[:close] : UNICODE[:check] }"
|
|
169
|
+
player_status = if Aromancer::Storage.get_player.nil?
|
|
170
|
+
I18n.t("routes.main_menu.not_signed_in")
|
|
171
|
+
else
|
|
172
|
+
I18n.t("shared.signed_in_as", as: Aromancer::Storage.get_player["alias"])
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
Aromancer::Prompt.say(
|
|
176
|
+
[nil, :v.to_s + Aromancer::VERSION, player_status, websocket_status, nil,].join(" | ")
|
|
177
|
+
)
|
|
178
|
+
end
|
|
179
|
+
|
|
117
180
|
def self.print_last_error(i18n_key = nil)
|
|
181
|
+
if Time.now.to_f - Aromancer::Cli.instance.error_timeout.to_f >= Aromancer::ERROR_EXPIRATION
|
|
182
|
+
Aromancer::Cli.instance.error_timeout = Time.now.to_i
|
|
183
|
+
Aromancer::Storage.set_last_error(nil)
|
|
184
|
+
return
|
|
185
|
+
end
|
|
186
|
+
|
|
118
187
|
last_error = Aromancer::Storage.get_last_error
|
|
119
188
|
return if last_error.nil?
|
|
189
|
+
|
|
120
190
|
last_error = last_error.symbolize_keys
|
|
121
191
|
message = last_error[:body]
|
|
122
192
|
begin
|
|
@@ -125,6 +195,13 @@ module Aromancer
|
|
|
125
195
|
rescue JSON::ParserError => e
|
|
126
196
|
message = last_error[:body]
|
|
127
197
|
end
|
|
128
|
-
|
|
198
|
+
|
|
199
|
+
if message.kind_of?(Hash)
|
|
200
|
+
message = JSON.pretty_generate(message)
|
|
201
|
+
elsif message.kind_of?(String)
|
|
202
|
+
message = message[0..777]
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
Aromancer::Prompt.say(I18n.t(i18n_key || "shared.last_error", status: last_error[:status], error: message), rjust: true)
|
|
129
206
|
end
|
|
130
207
|
end
|
data/locale/en.yml
CHANGED
|
@@ -11,6 +11,8 @@ en:
|
|
|
11
11
|
navigate: "navigate to %{route}."
|
|
12
12
|
update_cancel: "update cancelled."
|
|
13
13
|
update_confirm: "confirm update [%{new_value}] (enter y): "
|
|
14
|
+
signed_in_as: "authenticated as %{as}"
|
|
15
|
+
last_error: "error (%{status}). %{error}"
|
|
14
16
|
back: "back"
|
|
15
17
|
exit: "exit"
|
|
16
18
|
routes:
|
|
@@ -26,26 +28,31 @@ en:
|
|
|
26
28
|
subtitle: ""
|
|
27
29
|
new_game: "new game"
|
|
28
30
|
load_game: "load game"
|
|
31
|
+
find_game: "find game"
|
|
32
|
+
rules: "rules"
|
|
29
33
|
player_count: "enter player count (1-2): "
|
|
30
34
|
sign_out: "sign out"
|
|
31
|
-
not_signed_in: "
|
|
35
|
+
not_signed_in: "signed out"
|
|
32
36
|
configure:
|
|
33
37
|
title: "configure %{name}"
|
|
34
38
|
new_host: "enter new server host: "
|
|
35
39
|
new_port: "enter new server port: "
|
|
36
|
-
force_ssl_toggle: "
|
|
40
|
+
force_ssl_toggle: "ssl preference toggled to %{value}"
|
|
37
41
|
server_host: "host (%{stored})"
|
|
38
42
|
server_port: "port (%{stored})"
|
|
39
|
-
force_ssl: "
|
|
43
|
+
force_ssl: "ssl (%{stored})"
|
|
44
|
+
debug: "debug (%{stored})"
|
|
45
|
+
debug_toggle: "debug preference toggled to %{value}"
|
|
40
46
|
new_game:
|
|
41
|
-
player_count: "
|
|
42
|
-
story_count: "
|
|
47
|
+
player_count: "players"
|
|
48
|
+
story_count: "stories"
|
|
43
49
|
starting: "starting new game..."
|
|
44
50
|
status: "status"
|
|
45
51
|
cancelled: "cancelled. game not created."
|
|
46
52
|
legend:
|
|
47
53
|
title: "legend"
|
|
48
54
|
subtitle: "%{subtitle}"
|
|
55
|
+
alchemy_for: "alchemy_for_%{name}:"
|
|
49
56
|
arena_failed: "arena failed to load (%{status}). %{error}"
|
|
50
57
|
scroll: "scroll"
|
|
51
58
|
spoken_words: "scroll words"
|
|
@@ -61,6 +68,8 @@ en:
|
|
|
61
68
|
place_on_scroll: "place %{word} on the scroll."
|
|
62
69
|
options_for_word: "available options for the %{word} word."
|
|
63
70
|
last_error: "last error"
|
|
71
|
+
returning_to_main: "returning to main menu..."
|
|
72
|
+
your_alchemy: "alchemy"
|
|
64
73
|
legends:
|
|
65
74
|
help: ""
|
|
66
75
|
legend_menu:
|
|
@@ -69,5 +78,5 @@ en:
|
|
|
69
78
|
help: ""
|
|
70
79
|
stream:
|
|
71
80
|
title: "stream"
|
|
72
|
-
|
|
73
|
-
|
|
81
|
+
end: "eos"
|
|
82
|
+
hide_title: "hide stream"
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: aromancer
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.7
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- i2097i
|
|
@@ -245,6 +245,8 @@ files:
|
|
|
245
245
|
- checksums/aromancer-0.0.3.gem.sha512
|
|
246
246
|
- checksums/aromancer-0.0.4.gem.sha512
|
|
247
247
|
- checksums/aromancer-0.0.5.gem.sha512
|
|
248
|
+
- checksums/aromancer-0.0.6.gem.sha512
|
|
249
|
+
- checksums/aromancer-0.0.7.gem.sha512
|
|
248
250
|
- gem_graph.png
|
|
249
251
|
- lib/aromancer.rb
|
|
250
252
|
- lib/aromancer/.DS_Store
|