Compare commits

..

138 Commits

Author SHA1 Message Date
79bfeb2597 Update Rust crate clap to 4.4.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-08-29 00:34:26 +00:00
52f16f5c33 Update Rust crate actix-rt to 2.9.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-08-27 00:36:01 +00:00
d75a5d7d5b Update Rust crate clap to 4.4.0
All checks were successful
continuous-integration/drone/push Build is passing
2023-08-25 01:57:27 +00:00
473e6c0d1e Update Rust crate serde to 1.0.186
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-08-25 00:40:45 +00:00
9a93a29804 Update Rust crate serde to 1.0.185
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-08-22 00:40:14 +00:00
dad50314b0 Update Rust crate serde_with to 3.3.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-08-20 00:40:38 +00:00
b51aa8b7cb Update Rust crate clap to 4.3.23
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-08-19 00:29:37 +00:00
5a2fd31fa0 Update Rust crate clap to 4.3.22
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-08-18 00:29:12 +00:00
efcf33c539 Update Rust crate tokio to 1.32.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-08-17 00:25:07 +00:00
652a6d162b Update Rust crate serde_json to 1.0.105
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-08-16 00:32:29 +00:00
2ab3b5e55d Update Rust crate tokio to 1.31.0
All checks were successful
continuous-integration/drone/push Build is passing
2023-08-13 01:12:09 +00:00
f52dc84b45 Update Rust crate log to 0.4.20
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-08-13 00:33:17 +00:00
567473a223 Update Rust crate tokio to 1.30.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-08-10 00:30:59 +00:00
e95830f644 Update Rust crate clap to 4.3.21
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-08-09 00:29:27 +00:00
5d2b3e55ef Update Rust crate serde to 1.0.183
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-08-08 00:29:38 +00:00
c1f5f5f624 Update Rust crate crossterm to 0.27.0
All checks were successful
continuous-integration/drone/push Build is passing
2023-08-07 01:05:02 +00:00
c5b549244f Update Rust crate serde to 1.0.182
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-08-07 00:28:39 +00:00
7a93a1e3c6 Update Rust crate serde_with to 3.2.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-08-05 00:23:45 +00:00
1fff258248 Update Rust crate serde to 1.0.181
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-08-04 00:35:04 +00:00
0494847f2e Update Rust crate rustls to 0.21.6
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-08-03 00:22:07 +00:00
c9dd2fce12 Update Rust crate serde to 1.0.180
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-08-01 00:19:18 +00:00
a2b629d218 Update Rust crate serde_json to 1.0.104
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-07-30 00:26:23 +00:00
5379b84470 Update Rust crate serde to 1.0.178
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-07-29 00:29:22 +00:00
ef8772be97 Update Rust crate serde to 1.0.177
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-07-28 00:29:48 +00:00
007dae6fae Update Rust crate serde to 1.0.176
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-07-27 00:29:55 +00:00
29012b0f32 Update Rust crate serde to 1.0.175
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-07-26 07:04:49 +00:00
bf4aaada69 Update Rust crate tokio-tungstenite to 0.20.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-07-23 00:33:16 +00:00
c58c782219 Update Rust crate serde to 1.0.174
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-22 01:21:11 +00:00
90ae4a5193 Update Rust crate clap to 4.3.19
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-07-22 00:38:32 +00:00
b9085771a6 Update Rust crate num-traits to 0.2.16
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-07-21 00:36:58 +00:00
e7629f50e3 Update Rust crate serde to 1.0.173
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-20 00:52:08 +00:00
00603e4386 Update Rust crate clap to 4.3.17
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-07-20 00:16:45 +00:00
09eaabe43c Update Rust crate serde_with to 3.1.0
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 00:35:43 +00:00
09b2058934 Update Rust crate clap to 4.3.16
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-07-19 00:15:56 +00:00
c6143b3bec Update Rust crate uuid to 1.4.1
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 00:46:08 +00:00
f48c34c234 Update Rust crate clap to 4.3.14
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-07-18 00:16:23 +00:00
f1a179e12d Update Rust crate serde_json to 1.0.103
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-16 01:03:43 +00:00
067332b116 Update Rust crate semver to 1.0.18
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-07-16 00:15:56 +00:00
1257a637b1 Update Rust crate clap to 4.3.12
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-07-15 00:15:43 +00:00
e0822e3585 Update Rust crate serde_json to 1.0.102
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-07-13 00:15:53 +00:00
42bea6bba4 Update Rust crate serde_json to 1.0.101
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 00:51:14 +00:00
50e2db5256 Update Rust crate num to 0.4.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-07-12 00:16:01 +00:00
7ef779d804 Update Rust crate serde to 1.0.171
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-11 00:53:14 +00:00
13bb37fa51 Update Rust crate rustls to 0.21.5
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-07-11 00:16:11 +00:00
144848563b Update Rust crate serde to 1.0.170
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-07-10 00:16:30 +00:00
99bcf6e5ac Update Rust crate serde_json to 1.0.100
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-07-09 00:20:42 +00:00
daafca93a9 Update Rust crate rustls to 0.21.3
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-07-08 00:16:05 +00:00
04c4813cee Merge pull request 'Update Rust crate hyper-rustls to 0.24.1' (#58) from renovate/hyper-rustls-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #58
2023-07-07 15:54:51 +00:00
764f6f5112 Update Rust crate serde to 1.0.167
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-07-07 00:16:08 +00:00
0cfd2fc3f2 Update Rust crate hyper-rustls to 0.24.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-07-07 00:15:56 +00:00
46be9732de Attempt to enable auto merge
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-06 19:11:22 +02:00
6b4bd56684 Merge pull request 'Update Rust crate clap to 4.3.11' (#60) from renovate/clap-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #60
2023-07-06 17:08:08 +00:00
9a19272ba6 Merge pull request 'Update Rust crate serde to 1.0.166' (#57) from renovate/serde-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #57
2023-07-06 17:07:58 +00:00
c7f0be52cd Update Rust crate clap to 4.3.11
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-07-06 00:09:42 +00:00
37f7c20e36 Update Rust crate serde to 1.0.166
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-07-05 00:09:57 +00:00
75d55b4a23 Merge pull request 'Update Rust crate uuid to 1.4.0' (#55) from renovate/uuid-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #55
2023-07-04 16:42:27 +00:00
0c394f301a Merge pull request 'Update Rust crate clap to 4.3.10' (#52) from renovate/clap-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #52
2023-07-04 16:42:14 +00:00
c87a549a8a Merge pull request 'Update Rust crate num-derive to 0.4.0' (#56) from renovate/num-derive-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #56
2023-07-04 16:42:02 +00:00
98cc8884af Merge pull request 'Update Rust crate serde_json to 1.0.99' (#53) from renovate/serde_json-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #53
2023-07-04 16:41:38 +00:00
03c842017c Merge pull request 'Update Rust crate tokio to 1.29.1' (#54) from renovate/tokio-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #54
2023-07-04 16:41:26 +00:00
d87e5d816c Update Rust crate num-derive to 0.4.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-07-01 00:09:49 +00:00
eaf8d1c24e Update Rust crate clap to 4.3.10
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-07-01 00:09:36 +00:00
c4aa47f199 Update Rust crate tokio to 1.29.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-06-30 00:06:51 +00:00
9a623633cb Update Rust crate uuid to 1.4.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-06-28 00:08:46 +00:00
d1a28a0802 Update Rust crate serde_json to 1.0.99
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-06-25 00:09:04 +00:00
f6aa9977ba Merge pull request 'Update Rust crate clap to 4.3.5' (#51) from renovate/clap-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #51
2023-06-21 16:19:24 +00:00
7dd5464391 Update Rust crate clap to 4.3.5
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-06-21 00:16:55 +00:00
9f58d98a69 Merge pull request 'Update Rust crate serde_json to 1.0.97' (#50) from renovate/serde_json-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #50
2023-06-20 07:54:27 +00:00
841c6709cc Update Rust crate serde_json to 1.0.97
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-06-17 00:24:18 +00:00
e63566c6a9 Merge pull request 'Update Rust crate clap to 4.3.4' (#48) from renovate/clap-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #48
2023-06-15 13:31:01 +00:00
ac6f8987f4 Merge pull request 'Update Rust crate rustls to 0.21.2' (#49) from renovate/rustls-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #49
2023-06-15 13:30:54 +00:00
356fa75604 Update Rust crate rustls to 0.21.2
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-06-15 00:26:38 +00:00
563f33971f Update Rust crate clap to 4.3.4
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-06-15 00:26:26 +00:00
8f0db5cbe6 Merge pull request 'Update Rust crate log to 0.4.19' (#46) from renovate/log-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #46
2023-06-14 06:39:32 +00:00
5442536768 Merge pull request 'Update Rust crate uuid to 1.3.4' (#47) from renovate/uuid-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #47
2023-06-14 06:39:23 +00:00
f6b0962ec3 Update Rust crate uuid to 1.3.4
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-06-14 00:26:18 +00:00
2909bbc1c9 Update Rust crate log to 0.4.19
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-06-12 00:25:46 +00:00
fd1025c4a8 Merge pull request 'Update Rust crate serde to 1.0.164' (#44) from renovate/serde-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #44
2023-06-09 09:20:41 +00:00
ccadddaf15 Update Rust crate serde to 1.0.164
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-06-09 00:26:23 +00:00
2a0987defd Merge pull request 'Update Rust crate clap to 4.3.2' (#43) from renovate/clap-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #43
2023-06-06 06:35:00 +00:00
cb6ca75515 Update Rust crate clap to 4.3.2
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-06-06 00:26:16 +00:00
964c90e0d8 Merge pull request 'Update Rust crate tokio to 1.28.2' (#41) from renovate/tokio-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #41
2023-05-30 08:38:40 +00:00
81a05b8f66 Merge pull request 'Update Rust crate log to 0.4.18' (#42) from renovate/log-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #42
2023-05-30 08:38:31 +00:00
d2801c6b50 Update Rust crate log to 0.4.18
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-05-29 00:34:41 +00:00
1328baaba7 Update Rust crate tokio to 1.28.2
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-05-28 00:32:14 +00:00
d06585ad71 Update rustls, tokio-tungstenite & hyper-rustls
All checks were successful
continuous-integration/drone/push Build is passing
2023-05-25 09:54:12 +02:00
3ab8201c13 Merge pull request 'Update Rust crate serde_with to v3' (#40) from renovate/serde_with-3.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #40
2023-05-25 07:43:00 +00:00
c0232f602e Merge pull request 'Update Rust crate clap to 4.3.0' (#38) from renovate/clap-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #38
2023-05-24 06:34:58 +00:00
5f2b7654be Merge pull request 'Update Rust crate uuid to 1.3.3' (#37) from renovate/uuid-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #37
2023-05-24 06:34:49 +00:00
08a449352b Merge pull request 'Update Rust crate serde to 1.0.163' (#35) from renovate/serde-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #35
2023-05-23 11:37:40 +00:00
50fbbe50bf Merge pull request 'Update Rust crate tokio to 1.28.1' (#36) from renovate/tokio-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #36
2023-05-23 11:37:32 +00:00
f4356c656b Update Rust crate clap to 4.3.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-05-23 09:51:50 +00:00
b12657ef3a Merge pull request 'Update Rust crate clap to 4.2.7' (#34) from renovate/clap-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #34
2023-05-16 09:56:37 +00:00
ad868a7961 Update Rust crate uuid to 1.3.3
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-05-16 00:32:59 +00:00
221d1dfa13 Update Rust crate tokio to 1.28.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-05-16 00:32:51 +00:00
33ed27b892 Update Rust crate serde to 1.0.163
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-05-16 00:32:46 +00:00
9e6df3c78d Update Rust crate clap to 4.2.7
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-05-11 00:11:09 +00:00
6faf38003f Merge pull request 'Update Rust crate clap to 4.2.5' (#33) from renovate/clap-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #33
2023-05-05 17:57:09 +00:00
cee12d89f6 Merge branch 'master' into renovate/clap-4.x
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-05-02 05:58:13 +00:00
887dd849c6 Merge pull request 'Update Rust crate serde to 1.0.160' (#29) from renovate/serde-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #29
2023-05-02 05:56:26 +00:00
2c8686e9d2 Update Rust crate serde_with to v3
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-05-02 00:23:12 +00:00
7d92555a85 Merge pull request 'Update Rust crate serde_with to 2.3.3' (#31) from renovate/serde_with-2.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #31
2023-05-01 17:29:03 +00:00
0a7e9b9661 Merge branch 'master' into renovate/serde-1.x
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-05-01 17:21:14 +00:00
3af6fd730e Merge branch 'master' into renovate/serde_with-2.x
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-05-01 17:21:04 +00:00
b532324654 Merge pull request 'Update Rust crate uuid to 1.3.2' (#30) from renovate/uuid-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #30
2023-05-01 17:20:52 +00:00
de218d2ba1 Merge branch 'master' into renovate/uuid-1.x
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-05-01 11:40:23 +00:00
bb902cda9e Merge pull request 'Update Rust crate tokio to 1.28.0' (#32) from renovate/tokio-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #32
2023-05-01 08:35:57 +00:00
77d5b18f79 Fix cargo clippy issue
All checks were successful
continuous-integration/drone/push Build is passing
2023-05-01 10:28:43 +02:00
7125076f1f Update Rust crate uuid to 1.3.2
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2023-05-01 08:21:29 +00:00
4ed1c9c200 Update Rust crate serde_with to 2.3.3
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2023-04-29 00:09:17 +00:00
fa4b0bcdc2 Update Rust crate clap to 4.2.5
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2023-04-29 00:08:53 +00:00
40bff4f8e4 Update Rust crate tokio to 1.28.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2023-04-26 00:31:35 +00:00
283ea7d422 Update Rust crate serde to 1.0.160
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2023-04-26 00:31:21 +00:00
c746313c04 Merge pull request 'Update Rust crate clap to 4.2.4' (#28) from renovate/clap-4.x into master
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #28
2023-04-24 09:25:44 +00:00
86d45ad992 Merge pull request 'Update Rust crate serde_json to 1.0.96' (#27) from renovate/serde_json-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #27
2023-04-24 09:25:32 +00:00
5ba2e78fd0 Update Rust crate clap to 4.2.4
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-04-20 00:25:55 +00:00
1265d7f099 Merge pull request 'Update Rust crate clap to 4.2.2' (#25) from renovate/clap-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #25
2023-04-18 19:02:51 +00:00
b713117a70 Update Rust crate clap to 4.2.2
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-04-18 00:28:43 +00:00
a001017821 Update Rust crate serde_json to 1.0.96
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-04-13 00:28:31 +00:00
5acbe069c2 Merge pull request 'Update Rust crate serde_json to 1.0.95' (#23) from renovate/serde_json-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #23
2023-04-11 11:52:38 +00:00
6defd8edd2 Merge pull request 'Update Rust crate clap to 4.2.1' (#24) from renovate/clap-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #24
2023-04-11 11:52:28 +00:00
ef598dbff4 Update Rust crate clap to 4.2.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-04-01 00:09:41 +00:00
2abe1c95d0 Update Rust crate serde_json to 1.0.95
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-04-01 00:09:32 +00:00
f7bb0ddda2 Merge pull request 'Update Rust crate serde to 1.0.159' (#20) from renovate/serde-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #20
2023-03-29 08:35:44 +00:00
d1114f0295 Update Rust crate serde to 1.0.159
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-03-29 00:26:30 +00:00
f94a51027b Update dependencies to their latest versions
All checks were successful
continuous-integration/drone/push Build is passing
2023-03-19 18:58:34 +01:00
f5f2efcfde cargo update 2023-03-19 18:56:46 +01:00
eb9999b85b Fix build issue 2023-03-19 18:54:44 +01:00
df1d678ab9 Add more emojies
All checks were successful
continuous-integration/drone/push Build is passing
2022-10-18 10:05:43 +02:00
e88d64ff63 Bump to version 0.1.0 -> 0.2.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2022-10-18 09:39:54 +02:00
3ca6c43c9a Add additional routes for the future clients of SeaBattle 2022-10-18 09:34:26 +02:00
d4223be8b4 Improve test 2022-10-18 09:24:08 +02:00
83d0780954 Add a route to get default rules 2022-10-18 09:17:15 +02:00
6be3eae863 Clear terminal before returning to main menu
All checks were successful
continuous-integration/drone/push Build is passing
2022-10-18 09:13:59 +02:00
c763a24ca9 Can press 'Esc' key to close windows 2022-10-18 09:11:08 +02:00
10c099e03b Handle connection errors in a better way 2022-10-18 09:04:25 +02:00
eea2ecbf63 Add version check system 2022-10-18 08:58:36 +02:00
915426849b Rename variable 2022-10-18 08:13:25 +02:00
26 changed files with 1078 additions and 544 deletions

View File

@ -1,4 +1,10 @@
{ {
"$schema": "https://docs.renovatebot.com/renovate-schema.json", "$schema": "https://docs.renovatebot.com/renovate-schema.json",
"ignorePaths": ["**/flutter/**", "**/react/**"] "ignorePaths": ["**/flutter/**", "**/react/**"],
"packageRules": [
{
"matchUpdateTypes": ["minor", "patch"],
"automerge": true
}
]
} }

1259
rust/Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
[package] [package]
name = "sea_battle_backend" name = "sea_battle_backend"
version = "0.1.0" version = "0.2.0"
edition = "2021" edition = "2021"
license = "GPL-2.0-or-later" license = "GPL-2.0-or-later"
description = "A Sea Battle game backend server" description = "A Sea Battle game backend server"
@ -12,23 +12,24 @@ categories = [ "games" ]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
clap = { version = "4.0.15", features = ["derive"] } clap = { version = "4.4.1", features = ["derive"] }
log = "0.4.17" log = "0.4.20"
env_logger = "0.9.0" env_logger = "0.10.0"
serde = { version = "1.0.145", features = ["derive"] } serde = { version = "1.0.186", features = ["derive"] }
serde_json = "1.0.85" serde_json = "1.0.105"
actix-web = "4.1.0" actix-web = "4.1.0"
actix-cors = "0.6.2" actix-cors = "0.6.2"
actix = "0.13.0" actix = "0.13.0"
actix-web-actors = "4.1.0" actix-web-actors = "4.1.0"
actix-rt = "2.7.0" actix-rt = "2.9.0"
uuid = { version = "1.1.2", features = ["v4"] } uuid = { version = "1.4.1", features = ["v4"] }
rand = "0.8.5" rand = "0.8.5"
serde_with = "2.0.1" serde_with = "3.3.0"
tokio = { version = "1", features = ["full"] } tokio = { version = "1", features = ["full"] }
semver = "1.0.18"
[dev-dependencies] [dev-dependencies]
#reqwest = { version = "0.11.11", default-features = false, features = ["json", "rustls-tls"] } #reqwest = { version = "0.11.11", default-features = false, features = ["json", "rustls-tls"] }
tokio-tungstenite = "0.17.2" tokio-tungstenite = "0.20.0"
serde_urlencoded = "0.7.1" serde_urlencoded = "0.7.1"
futures = "0.3.23" futures = "0.3.23"

View File

@ -12,3 +12,14 @@ pub struct Args {
#[clap(short, long, value_parser)] #[clap(short, long, value_parser)]
pub cors: Option<String>, pub cors: Option<String>,
} }
#[cfg(test)]
mod test {
use crate::args::Args;
#[test]
fn verify_cli() {
use clap::CommandFactory;
Args::command().debug_assert()
}
}

View File

@ -1,5 +1,8 @@
//! # Project constants //! # Project constants
pub const MIN_REQUIRED_VERSION: &str = "0.1.0";
pub const CURRENT_VERSION: &str = env!("CARGO_PKG_VERSION");
pub const MIN_BOATS_NUMBER: usize = 1; pub const MIN_BOATS_NUMBER: usize = 1;
pub const MAX_BOATS_NUMBER: usize = 10; pub const MAX_BOATS_NUMBER: usize = 10;

View File

@ -361,7 +361,7 @@ impl BoatsLayout {
mod test { mod test {
use crate::data::boats_layout::{BoatDirection, BoatPosition, BoatsLayout, Coordinates}; use crate::data::boats_layout::{BoatDirection, BoatPosition, BoatsLayout, Coordinates};
use crate::data::game_map::GameMap; use crate::data::game_map::GameMap;
use crate::data::{BotType, GameRules, PlayConfiguration, PrintableMap}; use crate::data::*;
#[test] #[test]
fn dist_coordinates_eq() { fn dist_coordinates_eq() {
@ -488,9 +488,7 @@ mod test {
map_height: 5, map_height: 5,
boats_str: "1,1".to_string(), boats_str: "1,1".to_string(),
boats_can_touch: false, boats_can_touch: false,
player_continue_on_hit: false, ..Default::default()
strike_timeout: None,
bot_type: BotType::Random,
}; };
let mut boats = BoatsLayout(vec![ let mut boats = BoatsLayout(vec![

View File

@ -4,6 +4,7 @@ pub use game_map::*;
pub use game_rules::*; pub use game_rules::*;
pub use play_config::*; pub use play_config::*;
pub use printable_map::*; pub use printable_map::*;
pub use version::*;
mod boats_layout; mod boats_layout;
mod current_game_status; mod current_game_status;
@ -11,3 +12,4 @@ mod game_map;
mod game_rules; mod game_rules;
mod play_config; mod play_config;
mod printable_map; mod printable_map;
mod version;

View File

@ -0,0 +1,32 @@
//! # Version Info
//!
//! Contains server version requirements information
use crate::consts;
use crate::utils::res_utils::Res;
use semver::Version;
#[derive(serde::Serialize, serde::Deserialize)]
pub struct VersionInfo {
current: String,
min_required: String,
}
impl VersionInfo {
pub fn load_static() -> Self {
Self {
current: consts::CURRENT_VERSION.to_string(),
min_required: consts::MIN_REQUIRED_VERSION.to_string(),
}
}
/// Check if builtin version is compatible with a remote version or not
pub fn is_compatible_with_static_version(&self) -> Res<bool> {
let static_version = Self::load_static();
let local_current = Version::parse(&static_version.current)?;
let min_required = Version::parse(&self.min_required)?;
Ok(min_required <= local_current)
}
}

View File

@ -4,7 +4,7 @@ use actix_web::{web, App, HttpRequest, HttpResponse, HttpServer, Responder};
use actix_web_actors::ws; use actix_web_actors::ws;
use crate::args::Args; use crate::args::Args;
use crate::data::{GameRules, PlayConfiguration}; use crate::data::{BoatsLayout, GameRules, PlayConfiguration, VersionInfo};
use crate::dispatcher_actor::DispatcherActor; use crate::dispatcher_actor::DispatcherActor;
use crate::human_player_ws::{HumanPlayerWS, StartMode}; use crate::human_player_ws::{HumanPlayerWS, StartMode};
@ -18,11 +18,45 @@ async fn not_found() -> impl Responder {
HttpResponse::NotFound().json("You missed your strike lol") HttpResponse::NotFound().json("You missed your strike lol")
} }
/// Get bot configuration /// Get version information
async fn version_information() -> impl Responder {
HttpResponse::Ok().json(VersionInfo::load_static())
}
/// Get game configuration
async fn game_configuration() -> impl Responder { async fn game_configuration() -> impl Responder {
HttpResponse::Ok().json(PlayConfiguration::default()) HttpResponse::Ok().json(PlayConfiguration::default())
} }
/// Get default game rules
async fn default_game_rules() -> impl Responder {
HttpResponse::Ok().json(GameRules::random_players_rules())
}
/// Validate game rules
async fn validate_game_rules(rules: web::Json<GameRules>) -> impl Responder {
HttpResponse::Ok().json(rules.get_errors())
}
/// Generate random boats layout
async fn gen_boats_layout(rules: web::Json<GameRules>) -> impl Responder {
let errors = rules.get_errors();
if !errors.is_empty() {
return HttpResponse::BadRequest().json(errors);
}
match BoatsLayout::gen_random_for_rules(&rules) {
Ok(l) => HttpResponse::Ok().json(l),
Err(e) => {
log::error!(
"Failed to generate boats layout for valid game rules: {} ! / Rules: {:?}",
e,
rules
);
HttpResponse::InternalServerError().json("Failed to generate random layout!")
}
}
}
#[derive(serde::Serialize, serde::Deserialize, Eq, PartialEq, Debug)] #[derive(serde::Serialize, serde::Deserialize, Eq, PartialEq, Debug)]
pub struct BotPlayQuery { pub struct BotPlayQuery {
#[serde(flatten)] #[serde(flatten)]
@ -130,6 +164,7 @@ async fn start_random(
log::info!("New random play"); log::info!("New random play");
resp resp
} }
pub async fn start_server(args: Args) -> std::io::Result<()> { pub async fn start_server(args: Args) -> std::io::Result<()> {
log::info!("Start to listen on {}", args.listen_address); log::info!("Start to listen on {}", args.listen_address);
@ -148,7 +183,11 @@ pub async fn start_server(args: Args) -> std::io::Result<()> {
App::new() App::new()
.app_data(web::Data::new(dispatcher_actor.clone())) .app_data(web::Data::new(dispatcher_actor.clone()))
.wrap(cors) .wrap(cors)
.route("/version", web::get().to(version_information))
.route("/config", web::get().to(game_configuration)) .route("/config", web::get().to(game_configuration))
.route("/game_rules/default", web::get().to(default_game_rules))
.route("/game_rules/validate", web::post().to(validate_game_rules))
.route("/generate_boats_layout", web::post().to(gen_boats_layout))
.route("/play/bot", web::get().to(start_bot_play)) .route("/play/bot", web::get().to(start_bot_play))
.route("/play/create_invite", web::get().to(start_create_invite)) .route("/play/create_invite", web::get().to(start_create_invite))
.route("/play/accept_invite", web::get().to(start_accept_invite)) .route("/play/accept_invite", web::get().to(start_accept_invite))

View File

@ -1,6 +1,6 @@
[package] [package]
name = "sea_battle_cli_player" name = "sea_battle_cli_player"
version = "0.1.0" version = "0.2.0"
edition = "2021" edition = "2021"
license = "GPL-2.0-or-later" license = "GPL-2.0-or-later"
description = "A Sea Battle game shell client" description = "A Sea Battle game shell client"
@ -12,22 +12,23 @@ categories = [ "games" ]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
sea_battle_backend = { path = "../sea_battle_backend", version = "0.1.0" } sea_battle_backend = { path = "../sea_battle_backend", version = "0.2.0" }
clap = { version = "4.0.15", features = ["derive"] } clap = { version = "4.4.1", features = ["derive"] }
log = "0.4.17" log = "0.4.20"
env_logger = "0.9.0" env_logger = "0.10.0"
tui = "0.19.0" tui = "0.19.0"
crossterm = "0.25.0" crossterm = "0.27.0"
lazy_static = "1.4.0" lazy_static = "1.4.0"
tokio = "1.21.2" tokio = "1.32.0"
num = "0.4.0" num = "0.4.1"
num-traits = "0.2.15" num-traits = "0.2.16"
num-derive = "0.3.3" num-derive = "0.4.0"
textwrap = "0.15.1" textwrap = "0.16.0"
tokio-tungstenite = { version = "0.17.2", features = ["__rustls-tls", "rustls-tls-native-roots"] } tokio-tungstenite = { version = "0.20.0", features = ["__rustls-tls", "rustls-tls-native-roots"] }
serde_urlencoded = "0.7.1" serde_urlencoded = "0.7.1"
futures = "0.3.23" futures = "0.3.23"
serde_json = "1.0.85" serde_json = "1.0.105"
hostname = "0.3.1" hostname = "0.3.1"
rustls = "0.20.6" rustls = "0.21.6"
hyper-rustls = { version = "0.23.0", features = ["rustls-native-certs"] } hyper-rustls = { version = "0.24.1", features = ["rustls-native-certs"] }
reqwest = { version = "0.11", features = ["json", "rustls-tls"], default-features = false }

View File

@ -20,7 +20,7 @@ pub struct CliArgs {
value_parser, value_parser,
default_value = "https://seabattleapi.communiquons.org" default_value = "https://seabattleapi.communiquons.org"
)] )]
pub remote_server_uri: String, pub remote_server: String,
/// Local server listen address /// Local server listen address
#[clap(short, long, default_value = "127.0.0.1:5679")] #[clap(short, long, default_value = "127.0.0.1:5679")]
@ -61,3 +61,14 @@ lazy_static::lazy_static! {
pub fn cli_args() -> &'static CliArgs { pub fn cli_args() -> &'static CliArgs {
&ARGS &ARGS
} }
#[cfg(test)]
mod test {
use crate::cli_args::CliArgs;
#[test]
fn verify_cli() {
use clap::CommandFactory;
CliArgs::command().debug_assert()
}
}

View File

@ -3,12 +3,13 @@ use crate::server;
use futures::stream::{SplitSink, SplitStream}; use futures::stream::{SplitSink, SplitStream};
use futures::{SinkExt, StreamExt}; use futures::{SinkExt, StreamExt};
use hyper_rustls::ConfigBuilderExt; use hyper_rustls::ConfigBuilderExt;
use sea_battle_backend::data::GameRules; use sea_battle_backend::data::*;
use sea_battle_backend::human_player_ws::{ClientMessage, ServerMessage}; use sea_battle_backend::human_player_ws::{ClientMessage, ServerMessage};
use sea_battle_backend::server::{ use sea_battle_backend::server::{
AcceptInviteQuery, BotPlayQuery, CreateInviteQuery, PlayRandomQuery, AcceptInviteQuery, BotPlayQuery, CreateInviteQuery, PlayRandomQuery,
}; };
use sea_battle_backend::utils::res_utils::{boxed_error, Res}; use sea_battle_backend::utils::res_utils::{boxed_error, Res};
use std::error::Error;
use std::fmt::Display; use std::fmt::Display;
use std::sync::mpsc::TryRecvError; use std::sync::mpsc::TryRecvError;
use std::sync::{mpsc, Arc}; use std::sync::{mpsc, Arc};
@ -18,6 +19,11 @@ use tokio_tungstenite::{MaybeTlsStream, WebSocketStream};
type WsStream = WebSocketStream<MaybeTlsStream<TcpStream>>; type WsStream = WebSocketStream<MaybeTlsStream<TcpStream>>;
pub enum GetRemoteVersionError {
ConnectionFailed,
Other(Box<dyn Error>),
}
/// Connection client /// Connection client
/// ///
/// This structure acts as a wrapper around websocket connection that handles automatically parsing /// This structure acts as a wrapper around websocket connection that handles automatically parsing
@ -28,6 +34,24 @@ pub struct Client {
} }
impl Client { impl Client {
/// Get remote server version
pub async fn get_server_version() -> Result<VersionInfo, GetRemoteVersionError> {
let url = format!("{}/version", cli_args().remote_server);
log::debug!("Getting remote information from {} ...", url);
let res = match reqwest::get(url).await {
Ok(r) => r,
Err(e) if e.is_timeout() || e.is_connect() => {
return Err(GetRemoteVersionError::ConnectionFailed)
}
Err(e) => return Err(GetRemoteVersionError::Other(Box::new(e))),
};
res.json()
.await
.map_err(|e| GetRemoteVersionError::Other(Box::new(e)))
}
/// Start to play against a bot /// Start to play against a bot
/// ///
/// When playing against a bot, local server is always used /// When playing against a bot, local server is always used
@ -38,7 +62,7 @@ impl Client {
&cli_args().local_server_address(), &cli_args().local_server_address(),
&format!( &format!(
"/play/bot?{}", "/play/bot?{}",
serde_urlencoded::to_string(&BotPlayQuery { serde_urlencoded::to_string(BotPlayQuery {
rules: rules.clone(), rules: rules.clone(),
player_name: "Human".to_string() player_name: "Human".to_string()
}) })
@ -51,10 +75,10 @@ impl Client {
/// Start to play against a random player /// Start to play against a random player
pub async fn start_random_play<D: Display>(player_name: D) -> Res<Self> { pub async fn start_random_play<D: Display>(player_name: D) -> Res<Self> {
Self::connect_url( Self::connect_url(
&cli_args().remote_server_uri, &cli_args().remote_server,
&format!( &format!(
"/play/random?{}", "/play/random?{}",
serde_urlencoded::to_string(&PlayRandomQuery { serde_urlencoded::to_string(PlayRandomQuery {
player_name: player_name.to_string() player_name: player_name.to_string()
}) })
.unwrap() .unwrap()
@ -66,10 +90,10 @@ impl Client {
/// Start a play by creating an invite /// Start a play by creating an invite
pub async fn start_create_invite<D: Display>(rules: &GameRules, player_name: D) -> Res<Self> { pub async fn start_create_invite<D: Display>(rules: &GameRules, player_name: D) -> Res<Self> {
Self::connect_url( Self::connect_url(
&cli_args().remote_server_uri, &cli_args().remote_server,
&format!( &format!(
"/play/create_invite?{}", "/play/create_invite?{}",
serde_urlencoded::to_string(&CreateInviteQuery { serde_urlencoded::to_string(CreateInviteQuery {
rules: rules.clone(), rules: rules.clone(),
player_name: player_name.to_string() player_name: player_name.to_string()
}) })
@ -82,10 +106,10 @@ impl Client {
/// Start a play by accepting an invite /// Start a play by accepting an invite
pub async fn start_accept_invite<D: Display>(code: String, player_name: D) -> Res<Self> { pub async fn start_accept_invite<D: Display>(code: String, player_name: D) -> Res<Self> {
Self::connect_url( Self::connect_url(
&cli_args().remote_server_uri, &cli_args().remote_server,
&format!( &format!(
"/play/accept_invite?{}", "/play/accept_invite?{}",
serde_urlencoded::to_string(&AcceptInviteQuery { serde_urlencoded::to_string(AcceptInviteQuery {
code, code,
player_name: player_name.to_string() player_name: player_name.to_string()
}) })
@ -109,7 +133,7 @@ impl Client {
.with_no_client_auth(); .with_no_client_auth();
let connector = tokio_tungstenite::Connector::Rustls(Arc::new(config)); let connector = tokio_tungstenite::Connector::Rustls(Arc::new(config));
tokio_tungstenite::connect_async_tls_with_config(ws_url, None, Some(connector)).await? tokio_tungstenite::connect_async_tls_with_config(ws_url, None, false,Some(connector)).await?
} else { } else {
// Perform an unsecure connection // Perform an unsecure connection
tokio_tungstenite::connect_async(ws_url).await? tokio_tungstenite::connect_async(ws_url).await?

View File

@ -2,7 +2,7 @@ extern crate core;
pub mod cli_args; pub mod cli_args;
pub mod client; pub mod client;
pub mod constants; pub mod consts;
pub mod server; pub mod server;
pub mod ui_screens; pub mod ui_screens;
pub mod ui_widgets; pub mod ui_widgets;

View File

@ -18,7 +18,7 @@ use sea_battle_backend::consts::{
use sea_battle_backend::data::GameRules; use sea_battle_backend::data::GameRules;
use sea_battle_backend::utils::res_utils::Res; use sea_battle_backend::utils::res_utils::Res;
use sea_battle_cli_player::cli_args::{cli_args, TestDevScreen}; use sea_battle_cli_player::cli_args::{cli_args, TestDevScreen};
use sea_battle_cli_player::client::Client; use sea_battle_cli_player::client::{Client, GetRemoteVersionError};
use sea_battle_cli_player::server::run_server; use sea_battle_cli_player::server::run_server;
use sea_battle_cli_player::ui_screens::configure_game_rules::GameRulesConfigurationScreen; use sea_battle_cli_player::ui_screens::configure_game_rules::GameRulesConfigurationScreen;
use sea_battle_cli_player::ui_screens::game_screen::GameScreen; use sea_battle_cli_player::ui_screens::game_screen::GameScreen;
@ -35,10 +35,10 @@ async fn run_dev<B: Backend>(
d: TestDevScreen, d: TestDevScreen,
) -> Result<(), Box<dyn Error>> { ) -> Result<(), Box<dyn Error>> {
let res = match d { let res = match d {
TestDevScreen::Popup => popup_screen::PopupScreen::new("Welcome there!!") TestDevScreen::Popup => PopupScreen::new("Welcome there!!")
.show(terminal)? .show(terminal)?
.as_string(), .as_string(),
TestDevScreen::Input => input_screen::InputScreen::new("What it your name ?") TestDevScreen::Input => InputScreen::new("What it your name ?")
.set_title("A custom title") .set_title("A custom title")
.show(terminal)? .show(terminal)?
.as_string(), .as_string(),
@ -50,9 +50,9 @@ async fn run_dev<B: Backend>(
TestDevScreen::SelectBotType => select_bot_type_screen::SelectBotTypeScreen::default() TestDevScreen::SelectBotType => select_bot_type_screen::SelectBotTypeScreen::default()
.show(terminal)? .show(terminal)?
.as_string(), .as_string(),
TestDevScreen::SelectPlayMode => select_play_mode_screen::SelectPlayModeScreen::default() TestDevScreen::SelectPlayMode => {
.show(terminal)? SelectPlayModeScreen::default().show(terminal)?.as_string()
.as_string(), }
TestDevScreen::SetBoatsLayout => { TestDevScreen::SetBoatsLayout => {
let rules = GameRules { let rules = GameRules {
boats_can_touch: true, boats_can_touch: true,
@ -64,7 +64,7 @@ async fn run_dev<B: Backend>(
.as_string() .as_string()
} }
TestDevScreen::ConfigureGameRules => { TestDevScreen::ConfigureGameRules => {
configure_game_rules::GameRulesConfigurationScreen::new(GameRules::default()) GameRulesConfigurationScreen::new(GameRules::default())
.show(terminal)? .show(terminal)?
.as_string() .as_string()
} }
@ -99,14 +99,41 @@ async fn run_app<B: Backend>(terminal: &mut Terminal<B>) -> Res {
return run_dev(terminal, d).await; return run_dev(terminal, d).await;
} }
let mut checked_online_compatibility = false;
let mut rules = GameRules::default(); let mut rules = GameRules::default();
let mut username = "".to_string(); let mut username = "".to_string();
loop { loop {
terminal.clear()?;
let choice = SelectPlayModeScreen::default().show(terminal)?; let choice = SelectPlayModeScreen::default().show(terminal)?;
if let ScreenResult::Ok(c) = choice { if let ScreenResult::Ok(c) = choice {
// Check compatibility
if c.is_online_play_mode() && !checked_online_compatibility {
PopupScreen::new("🖥 Checking remote server version...").show_once(terminal)?;
let valid_version = match Client::get_server_version().await {
Ok(v) => v.is_compatible_with_static_version().unwrap_or(false),
Err(GetRemoteVersionError::ConnectionFailed) => {
PopupScreen::new("❌ Could not connect to remote server!")
.show(terminal)?;
continue;
}
Err(GetRemoteVersionError::Other(e)) => {
log::error!("Could not load remote server information! {:?}", e);
false
}
};
if !valid_version {
PopupScreen::new("❌ Unfortunately, it seems that your version of Sea Battle Cli player is too old to be used online...\n\nPlease update it before trying to play online...").show(terminal)?;
continue;
}
checked_online_compatibility = true;
}
if c.need_player_name() && username.is_empty() { if c.need_player_name() && username.is_empty() {
username = query_player_name(terminal)?; username = query_player_name(terminal)?;
} }
@ -123,17 +150,17 @@ async fn run_app<B: Backend>(terminal: &mut Terminal<B>) -> Res {
let client = match choice { let client = match choice {
ScreenResult::Ok(SelectPlayModeResult::PlayRandom) => { ScreenResult::Ok(SelectPlayModeResult::PlayRandom) => {
Client::start_random_play(&username).await? Client::start_random_play(&username).await
} }
// Play against bot // Play against bot
ScreenResult::Ok(SelectPlayModeResult::PlayAgainstBot) => { ScreenResult::Ok(SelectPlayModeResult::PlayAgainstBot) => {
Client::start_bot_play(&rules).await? Client::start_bot_play(&rules).await
} }
// Create invite // Create invite
ScreenResult::Ok(SelectPlayModeResult::CreateInvite) => { ScreenResult::Ok(SelectPlayModeResult::CreateInvite) => {
Client::start_create_invite(&rules, &username).await? Client::start_create_invite(&rules, &username).await
} }
// Join invite // Join invite
@ -149,14 +176,22 @@ async fn run_app<B: Backend>(terminal: &mut Terminal<B>) -> Res {
}; };
PopupScreen::new("🔌 Connecting...").show_once(terminal)?; PopupScreen::new("🔌 Connecting...").show_once(terminal)?;
Client::start_accept_invite(code, &username).await? Client::start_accept_invite(code, &username).await
} }
ScreenResult::Canceled | ScreenResult::Ok(SelectPlayModeResult::Exit) => return Ok(()), ScreenResult::Canceled | ScreenResult::Ok(SelectPlayModeResult::Exit) => return Ok(()),
}; };
// Display game screen match client {
GameScreen::new(client).show(terminal).await?; Ok(client) => {
// Display game screen
GameScreen::new(client).show(terminal).await?;
}
Err(e) => {
log::error!("Failed to connect to server: {}", e);
PopupScreen::new("❌ Failed to connect to server!").show(terminal)?;
}
};
} }
} }

View File

@ -16,7 +16,7 @@ use tui::{Frame, Terminal};
use sea_battle_backend::data::GameRules; use sea_battle_backend::data::GameRules;
use crate::constants::{HIGHLIGHT_COLOR, TICK_RATE}; use crate::consts::{HIGHLIGHT_COLOR, TICK_RATE};
use crate::ui_screens::popup_screen::show_screen_too_small_popup; use crate::ui_screens::popup_screen::show_screen_too_small_popup;
use crate::ui_screens::select_bot_type_screen::SelectBotTypeScreen; use crate::ui_screens::select_bot_type_screen::SelectBotTypeScreen;
use crate::ui_screens::utils::centered_rect_size; use crate::ui_screens::utils::centered_rect_size;
@ -25,7 +25,7 @@ use crate::ui_widgets::button_widget::ButtonWidget;
use crate::ui_widgets::checkbox_widget::CheckboxWidget; use crate::ui_widgets::checkbox_widget::CheckboxWidget;
use crate::ui_widgets::text_editor_widget::TextEditorWidget; use crate::ui_widgets::text_editor_widget::TextEditorWidget;
#[derive(num_derive::FromPrimitive, num_derive::ToPrimitive, Eq, PartialEq)] #[derive(num_derive::FromPrimitive, num_derive::ToPrimitive, Eq, PartialEq, Copy, Clone)]
enum EditingField { enum EditingField {
MapWidth = 0, MapWidth = 0,
MapHeight, MapHeight,
@ -69,7 +69,7 @@ impl GameRulesConfigurationScreen {
if let Event::Key(key) = event::read()? { if let Event::Key(key) = event::read()? {
match key.code { match key.code {
// Quit app // Quit app
KeyCode::Char('q') => return Ok(ScreenResult::Canceled), KeyCode::Char('q') | KeyCode::Esc => return Ok(ScreenResult::Canceled),
// Navigate between fields // Navigate between fields
KeyCode::Up | KeyCode::Left => cursor_pos -= 1, KeyCode::Up | KeyCode::Left => cursor_pos -= 1,
@ -128,7 +128,7 @@ impl GameRulesConfigurationScreen {
} }
} }
KeyCode::Char(c) if ('0'..='9').contains(&c) => { KeyCode::Char(c) if c.is_ascii_digit() => {
let val = c.to_string().parse::<usize>().unwrap_or_default(); let val = c.to_string().parse::<usize>().unwrap_or_default();
if self.curr_field == EditingField::MapWidth if self.curr_field == EditingField::MapWidth
@ -283,10 +283,10 @@ impl GameRulesConfigurationScreen {
.constraints([Constraint::Percentage(50), Constraint::Percentage(50)]) .constraints([Constraint::Percentage(50), Constraint::Percentage(50)])
.split(chunks[EditingField::OK as usize]); .split(chunks[EditingField::OK as usize]);
let button = ButtonWidget::new("Cancel", self.curr_field == EditingField::Cancel); let button = ButtonWidget::cancel(self.curr_field == EditingField::Cancel);
f.render_widget(button, buttons_chunk[0]); f.render_widget(button, buttons_chunk[0]);
let button = ButtonWidget::new("OK", self.curr_field == EditingField::OK) let button = ButtonWidget::ok(self.curr_field == EditingField::OK)
.set_disabled(!self.rules.is_valid()); .set_disabled(!self.rules.is_valid());
f.render_widget(button, buttons_chunk[1]); f.render_widget(button, buttons_chunk[1]);

View File

@ -9,7 +9,7 @@ use tui::text::*;
use tui::widgets::*; use tui::widgets::*;
use tui::{Frame, Terminal}; use tui::{Frame, Terminal};
use crate::constants::*; use crate::consts::*;
use crate::ui_screens::utils::centered_rect_size; use crate::ui_screens::utils::centered_rect_size;
use crate::ui_screens::ScreenResult; use crate::ui_screens::ScreenResult;
use crate::ui_widgets::button_widget::ButtonWidget; use crate::ui_widgets::button_widget::ButtonWidget;
@ -18,6 +18,7 @@ use crate::ui_widgets::button_widget::ButtonWidget;
pub fn confirm<B: Backend>(terminal: &mut Terminal<B>, msg: &str) -> bool { pub fn confirm<B: Backend>(terminal: &mut Terminal<B>, msg: &str) -> bool {
matches!( matches!(
ConfirmDialogScreen::new(msg) ConfirmDialogScreen::new(msg)
.set_can_escape(true)
.show(terminal) .show(terminal)
.unwrap_or(ScreenResult::Canceled), .unwrap_or(ScreenResult::Canceled),
ScreenResult::Ok(true) ScreenResult::Ok(true)
@ -28,19 +29,24 @@ pub struct ConfirmDialogScreen<'a> {
title: &'a str, title: &'a str,
msg: &'a str, msg: &'a str,
is_confirm: bool, is_confirm: bool,
can_cancel: bool, can_escape: bool,
} }
impl<'a> ConfirmDialogScreen<'a> { impl<'a> ConfirmDialogScreen<'a> {
pub fn new(msg: &'a str) -> Self { pub fn new(msg: &'a str) -> Self {
Self { Self {
title: "Confirmation Request", title: "Confirmation Request",
msg, msg,
is_confirm: true, is_confirm: true,
can_cancel: false, can_escape: false,
} }
} }
pub fn set_can_escape(mut self, v: bool) -> Self {
self.can_escape = v;
self
}
pub fn show<B: Backend>( pub fn show<B: Backend>(
mut self, mut self,
terminal: &mut Terminal<B>, terminal: &mut Terminal<B>,
@ -56,7 +62,7 @@ impl<'a> ConfirmDialogScreen<'a> {
if event::poll(timeout)? { if event::poll(timeout)? {
if let Event::Key(key) = event::read()? { if let Event::Key(key) = event::read()? {
match key.code { match key.code {
KeyCode::Esc | KeyCode::Char('q') if self.can_cancel => { KeyCode::Esc | KeyCode::Char('q') if self.can_escape => {
return Ok(ScreenResult::Canceled) return Ok(ScreenResult::Canceled)
} }
@ -117,10 +123,10 @@ impl<'a> ConfirmDialogScreen<'a> {
.constraints([Constraint::Percentage(50), Constraint::Percentage(50)].as_ref()) .constraints([Constraint::Percentage(50), Constraint::Percentage(50)].as_ref())
.split(chunks[1]); .split(chunks[1]);
let cancel_button = ButtonWidget::new("Cancel", true).set_disabled(self.is_confirm); let cancel_button = ButtonWidget::cancel(true).set_disabled(self.is_confirm);
f.render_widget(cancel_button, buttons_area[0]); f.render_widget(cancel_button, buttons_area[0]);
let ok_button = ButtonWidget::new("Confirm", true).set_disabled(!self.is_confirm); let ok_button = ButtonWidget::new("Confirm", true).set_disabled(!self.is_confirm);
f.render_widget(ok_button, buttons_area[1]); f.render_widget(ok_button, buttons_area[1]);
} }
} }

View File

@ -16,7 +16,7 @@ use sea_battle_backend::utils::res_utils::Res;
use sea_battle_backend::utils::time_utils::time; use sea_battle_backend::utils::time_utils::time;
use crate::client::Client; use crate::client::Client;
use crate::constants::*; use crate::consts::*;
use crate::ui_screens::confirm_dialog_screen::confirm; use crate::ui_screens::confirm_dialog_screen::confirm;
use crate::ui_screens::popup_screen::{show_screen_too_small_popup, PopupScreen}; use crate::ui_screens::popup_screen::{show_screen_too_small_popup, PopupScreen};
use crate::ui_screens::set_boats_layout_screen::SetBoatsLayoutScreen; use crate::ui_screens::set_boats_layout_screen::SetBoatsLayoutScreen;
@ -147,7 +147,7 @@ impl GameScreen {
match key.code { match key.code {
// Leave game // Leave game
KeyCode::Char('q') KeyCode::Char('q') | KeyCode::Esc
if confirm(terminal, "Do you really want to leave game?") => if confirm(terminal, "Do you really want to leave game?") =>
{ {
self.client.close_connection().await; self.client.close_connection().await;

View File

@ -10,7 +10,7 @@ use tui::layout::*;
use tui::widgets::*; use tui::widgets::*;
use tui::{Frame, Terminal}; use tui::{Frame, Terminal};
use crate::constants::*; use crate::consts::*;
use crate::ui_screens::utils::*; use crate::ui_screens::utils::*;
use crate::ui_screens::ScreenResult; use crate::ui_screens::ScreenResult;
use crate::ui_widgets::button_widget::ButtonWidget; use crate::ui_widgets::button_widget::ButtonWidget;
@ -163,12 +163,12 @@ impl<'a> InputScreen<'a> {
.constraints([Constraint::Percentage(50), Constraint::Percentage(50)].as_ref()) .constraints([Constraint::Percentage(50), Constraint::Percentage(50)].as_ref())
.split(*chunks.last().unwrap()); .split(*chunks.last().unwrap());
let cancel_button = ButtonWidget::new("Cancel", self.is_cancel_hovered) let cancel_button = ButtonWidget::cancel(self.is_cancel_hovered)
.set_disabled(!self.can_cancel) .set_disabled(!self.can_cancel)
.set_min_width(8); .set_min_width(8);
f.render_widget(cancel_button, buttons_area[0]); f.render_widget(cancel_button, buttons_area[0]);
let ok_button = ButtonWidget::new("OK", !self.is_cancel_hovered) let ok_button = ButtonWidget::ok(!self.is_cancel_hovered)
.set_min_width(8) .set_min_width(8)
.set_disabled(error.is_some()); .set_disabled(error.is_some());
f.render_widget(ok_button, buttons_area[1]); f.render_widget(ok_button, buttons_area[1]);

View File

@ -9,7 +9,7 @@ use tui::text::*;
use tui::widgets::*; use tui::widgets::*;
use tui::{Frame, Terminal}; use tui::{Frame, Terminal};
use crate::constants::*; use crate::consts::*;
use crate::ui_screens::utils::centered_rect_size; use crate::ui_screens::utils::centered_rect_size;
use crate::ui_screens::ScreenResult; use crate::ui_screens::ScreenResult;
use crate::ui_widgets::button_widget::ButtonWidget; use crate::ui_widgets::button_widget::ButtonWidget;
@ -52,7 +52,7 @@ impl<'a> PopupScreen<'a> {
if event::poll(timeout)? { if event::poll(timeout)? {
if let Event::Key(key) = event::read()? { if let Event::Key(key) = event::read()? {
match key.code { match key.code {
KeyCode::Char('q') => return Ok(ScreenResult::Canceled), KeyCode::Char('q') | KeyCode::Esc => return Ok(ScreenResult::Canceled),
KeyCode::Enter => { KeyCode::Enter => {
return Ok(ScreenResult::Ok(())); return Ok(ScreenResult::Ok(()));
} }

View File

@ -11,7 +11,7 @@ use tui::{Frame, Terminal};
use sea_battle_backend::data::{BotDescription, BotType, PlayConfiguration}; use sea_battle_backend::data::{BotDescription, BotType, PlayConfiguration};
use crate::constants::{HIGHLIGHT_COLOR, TICK_RATE}; use crate::consts::{HIGHLIGHT_COLOR, TICK_RATE};
use crate::ui_screens::utils::centered_rect_size; use crate::ui_screens::utils::centered_rect_size;
use crate::ui_screens::ScreenResult; use crate::ui_screens::ScreenResult;
@ -49,7 +49,7 @@ impl SelectBotTypeScreen {
if event::poll(timeout)? { if event::poll(timeout)? {
if let Event::Key(key) = event::read()? { if let Event::Key(key) = event::read()? {
match key.code { match key.code {
KeyCode::Char('q') => return Ok(ScreenResult::Canceled), KeyCode::Char('q') | KeyCode::Esc => return Ok(ScreenResult::Canceled),
KeyCode::Enter => { KeyCode::Enter => {
return Ok(ScreenResult::Ok(self.types[self.curr_selection].r#type)); return Ok(ScreenResult::Ok(self.types[self.curr_selection].r#type));
} }

View File

@ -1,7 +1,7 @@
use std::io; use std::io;
use std::time::{Duration, Instant}; use std::time::{Duration, Instant};
use crate::constants::{HIGHLIGHT_COLOR, TICK_RATE}; use crate::consts::{HIGHLIGHT_COLOR, TICK_RATE};
use crate::ui_screens::utils::centered_rect_size; use crate::ui_screens::utils::centered_rect_size;
use crate::ui_screens::ScreenResult; use crate::ui_screens::ScreenResult;
use crossterm::event; use crossterm::event;
@ -33,6 +33,11 @@ impl SelectPlayModeResult {
pub fn need_custom_rules(&self) -> bool { pub fn need_custom_rules(&self) -> bool {
self == &SelectPlayModeResult::PlayAgainstBot || self == &SelectPlayModeResult::CreateInvite self == &SelectPlayModeResult::PlayAgainstBot || self == &SelectPlayModeResult::CreateInvite
} }
/// Specify whether a play mode is to be played online or not
pub fn is_online_play_mode(&self) -> bool {
self != &SelectPlayModeResult::PlayAgainstBot && self != &SelectPlayModeResult::Exit
}
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@ -87,7 +92,7 @@ impl SelectPlayModeScreen {
if crossterm::event::poll(timeout)? { if crossterm::event::poll(timeout)? {
if let Event::Key(key) = event::read()? { if let Event::Key(key) = event::read()? {
match key.code { match key.code {
KeyCode::Char('q') => return Ok(ScreenResult::Canceled), KeyCode::Char('q') | KeyCode::Esc => return Ok(ScreenResult::Canceled),
KeyCode::Enter => { KeyCode::Enter => {
return Ok(ScreenResult::Ok( return Ok(ScreenResult::Ok(
AVAILABLE_PLAY_MODES[self.curr_selection].value, AVAILABLE_PLAY_MODES[self.curr_selection].value,

View File

@ -12,7 +12,7 @@ use tui::{Frame, Terminal};
use sea_battle_backend::data::*; use sea_battle_backend::data::*;
use crate::constants::*; use crate::consts::*;
use crate::ui_screens::confirm_dialog_screen::confirm; use crate::ui_screens::confirm_dialog_screen::confirm;
use crate::ui_screens::popup_screen::show_screen_too_small_popup; use crate::ui_screens::popup_screen::show_screen_too_small_popup;
use crate::ui_screens::utils::{centered_rect_size, centered_text}; use crate::ui_screens::utils::{centered_rect_size, centered_text};
@ -66,7 +66,7 @@ impl<'a> SetBoatsLayoutScreen<'a> {
let event = event::read()?; let event = event::read()?;
if let Event::Key(key) = &event { if let Event::Key(key) = &event {
match key.code { match key.code {
KeyCode::Char('q') => { KeyCode::Char('q') | KeyCode::Esc => {
if !self.confirm_on_cancel if !self.confirm_on_cancel
|| confirm(terminal, "Do you really want to quit?") || confirm(terminal, "Do you really want to quit?")
{ {
@ -202,7 +202,7 @@ impl<'a> SetBoatsLayoutScreen<'a> {
.add_colored_cells(current_boat) .add_colored_cells(current_boat)
.add_colored_cells(invalid_boats) .add_colored_cells(invalid_boats)
.add_colored_cells(other_boats) .add_colored_cells(other_boats)
.set_title("Choose your boat layout") .set_title("🛥 Set your boats layout")
.set_yield_func(|c, r| { .set_yield_func(|c, r| {
for i in 0..r.width { for i in 0..r.width {
for j in 0..r.height { for j in 0..r.height {

View File

@ -1,6 +1,6 @@
use std::fmt::Display; use std::fmt::Display;
use crate::constants::HIGHLIGHT_COLOR; use crate::consts::HIGHLIGHT_COLOR;
use tui::buffer::Buffer; use tui::buffer::Buffer;
use tui::layout::Rect; use tui::layout::Rect;
use tui::style::{Color, Style}; use tui::style::{Color, Style};
@ -13,6 +13,7 @@ pub struct ButtonWidget {
label: String, label: String,
disabled: bool, disabled: bool,
min_width: usize, min_width: usize,
hover_bg_color: Color,
} }
impl ButtonWidget { impl ButtonWidget {
@ -22,9 +23,18 @@ impl ButtonWidget {
is_hovered, is_hovered,
disabled: false, disabled: false,
min_width: 0, min_width: 0,
hover_bg_color: HIGHLIGHT_COLOR,
} }
} }
pub fn cancel(is_hovered: bool) -> Self {
Self::new("❌ Cancel", is_hovered).set_hover_bg_color(Color::Red)
}
pub fn ok(is_hovered: bool) -> Self {
Self::new("✅ OK", is_hovered)
}
pub fn set_disabled(mut self, disabled: bool) -> Self { pub fn set_disabled(mut self, disabled: bool) -> Self {
self.disabled = disabled; self.disabled = disabled;
self self
@ -35,6 +45,11 @@ impl ButtonWidget {
self self
} }
pub fn set_hover_bg_color(mut self, v: Color) -> Self {
self.hover_bg_color = v;
self
}
pub fn estimated_size(&self) -> (u16, u16) { pub fn estimated_size(&self) -> (u16, u16) {
((self.label.len() + 2).max(self.min_width) as u16, 1) ((self.label.len() + 2).max(self.min_width) as u16, 1)
} }
@ -55,7 +70,7 @@ impl Widget for ButtonWidget {
let input = Paragraph::new(label.as_ref()).style(match (self.disabled, self.is_hovered) { let input = Paragraph::new(label.as_ref()).style(match (self.disabled, self.is_hovered) {
(true, _) => Style::default(), (true, _) => Style::default(),
(_, false) => Style::default().bg(Color::DarkGray), (_, false) => Style::default().bg(Color::DarkGray),
(_, true) => Style::default().fg(Color::White).bg(HIGHLIGHT_COLOR), (_, true) => Style::default().fg(Color::White).bg(self.hover_bg_color),
}); });
input.render(area, buf); input.render(area, buf);

View File

@ -1,4 +1,4 @@
use crate::constants::HIGHLIGHT_COLOR; use crate::consts::HIGHLIGHT_COLOR;
use std::fmt::Display; use std::fmt::Display;
use tui::buffer::Buffer; use tui::buffer::Buffer;
use tui::layout::Rect; use tui::layout::Rect;

View File

@ -1,6 +1,6 @@
use std::fmt::Display; use std::fmt::Display;
use crate::constants::HIGHLIGHT_COLOR; use crate::consts::HIGHLIGHT_COLOR;
use tui::buffer::Buffer; use tui::buffer::Buffer;
use tui::layout::Rect; use tui::layout::Rect;
use tui::style::*; use tui::style::*;