Compare commits

..

158 Commits

Author SHA1 Message Date
c45f002f82
tweak trains and trainlines displayed zoom (#412) 2024-11-11 19:51:31 +01:00
e1c9bdb8bd
Show layer selector only if more that one layer (#411)
Co-authored-by: Pierre-Yves Rollo <dev@pyrollo.com>
2024-11-11 19:50:45 +01:00
BuckarooBanzay
a7b5226fd1 add a / alpha component to json color mapping export 2024-08-11 13:44:11 +02:00
1F616EMO~nya
f266593f9a
Add address for POIs (#404)
* Add address for POIs

* Add missing semicolon
2024-08-10 09:19:24 +02:00
1F616EMO~nya
02bb99f739
Prevent POI image from vertically overflowing too much (#395) 2024-07-05 13:52:39 +02:00
BuckarooBanzay
3be317d09f Merge branch 'master' of github.com:minetest-mapserver/mapserver 2024-06-28 17:29:41 +02:00
Buckaroo Banzai
fc7303947d
Cicd overhaul (#393)
* go mod tidy

* alpha channel temp fix

* cicd overhaul

---------

Co-authored-by: BuckarooBanzay <BuckarooBanzay@users.noreply.github.com>
2024-06-28 17:29:29 +02:00
BuckarooBanzay
d20d99d19f alpha channel temp fix 2024-06-28 16:57:05 +02:00
BuckarooBanzay
f1c698c7fa go mod tidy 2024-06-28 16:55:00 +02:00
renovate[bot]
7219590c91 fix(deps): update module github.com/prometheus/client_golang to v1.19.1 2024-06-28 16:50:35 +02:00
renovate[bot]
0154742246 fix(deps): update module github.com/minetest-go/mapparser to v0.1.9 2024-06-28 16:50:24 +02:00
renovate[bot]
cb2ad7f058 fix(deps): update module github.com/golang-migrate/migrate/v4 to v4.17.1 2024-06-28 16:49:12 +02:00
renovate[bot]
d031739c07 fix(deps): update module github.com/gorilla/websocket to v1.5.3 2024-06-28 16:49:01 +02:00
renovate[bot]
5e0e4742b1 fix(deps): update dependency bootstrap to v5.3.3 2024-06-28 16:48:10 +02:00
renovate[bot]
658a3cc9e0 fix(deps): update module github.com/minetest-go/colormapping to v1.0.5 2024-06-28 16:47:40 +02:00
renovate[bot]
9176638f20 fix(deps): update dependency @fortawesome/fontawesome-free to v6.5.2 2024-06-28 16:47:21 +02:00
renovate[bot]
4d304e1008 chore(deps): update postgres docker tag to v16.3 2024-06-28 16:47:06 +02:00
renovate[bot]
544e9381e6 fix(deps): update module github.com/stretchr/testify to v1.9.0 2024-06-28 16:46:39 +02:00
renovate[bot]
3c47015b62 fix(deps): update module modernc.org/sqlite to v1.30.1 2024-06-28 16:46:28 +02:00
renovate[bot]
6ab735a7a5 chore(deps): update goreleaser/goreleaser-action action to v6 2024-06-28 16:46:16 +02:00
BuckarooBanzay
7db8f767ca add larger bound to map limit 2024-06-28 16:38:13 +02:00
BuckarooBanzay
6687482a26 update mapserver mod 2024-06-28 16:33:19 +02:00
1F616EMO~nya
070c7f7bdf
Allow displaying image in POIs (#389)
* Add image to POIs

* fix missing quote

* Swap <hr> position
2024-06-28 16:32:59 +02:00
1F616EMO~nya
89ea214d02
Move center to marker when clicked (#388)
* Pan center to the marker upon clicking

* Properly bind onPopupOpen

* Messed up parameter types

* Fine-tune panTo parameters

* This should be the fix

* So yet again I forgot to save

* Move impllentation back to AbstractIconOverlay

* cleanup

* Yet another attempt

* Move panTo to marker
2024-06-28 16:26:33 +02:00
1F616EMO~nya
ff1b0dc47a
Fix flickering when updatig new tile (attempt 2) (#387) 2024-06-16 08:59:55 +02:00
BuckarooBanzay
47f1446ec1 ci fixes 2024-06-06 19:47:31 +02:00
BuckarooBanzay
fec735ee93 update config in dev env 2024-06-06 19:45:37 +02:00
Buckaroo Banzai
dc5a401d8b
Fork 20240605 um area forsale (#379)
* Add For Sale Sings for Unified Money

* Change popup and icon size

* Revert icon size

* Add For Sale Sign into searches

* Fix syntax

* Minor display change

* Skip unconfigured for sale signs

---------

Co-authored-by: 1F616EMO <root@1f616emo.xyz>
2024-06-06 19:40:36 +02:00
renovate[bot]
a7bf46e9e9 chore(deps): update dependency rollup to v4.18.0 2024-06-06 19:27:35 +02:00
renovate[bot]
dc07464b78 chore(deps): update golang docker tag to v1.22.4 2024-06-06 19:27:24 +02:00
renovate[bot]
071239c484 chore(deps): update node.js to v21.7.3 2024-06-06 19:27:17 +02:00
renovate[bot]
021a499d8f chore(deps): update actions/cache action to v4 2024-06-06 19:27:07 +02:00
renovate[bot]
776aaaaa32 fix(deps): update module github.com/google/uuid to v1.6.0 2024-06-06 19:27:00 +02:00
renovate[bot]
34b303fdec chore(deps): update shogo82148/actions-goveralls action to v1.9.0 2024-06-06 19:26:53 +02:00
dependabot[bot]
6cb5617170 Bump golang.org/x/net from 0.18.0 to 0.23.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.18.0 to 0.23.0.
- [Commits](https://github.com/golang/net/compare/v0.18.0...v0.23.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-06 19:26:34 +02:00
renovate[bot]
a1f84556ad chore(deps): update actions/setup-go action to v5.0.1 2024-06-06 19:26:27 +02:00
1F616EMO~nya
2c0edb328f
Support Phonographs (#376)
* Support Phonographs

* Fix comment

* Add missing import

* Fix variable name
2024-06-06 19:23:23 +02:00
1F616EMO~nya
cbf58dfbf8
Put markers at the center of nodes (#374)
* Put markers at the center of nodes

* Do the fix on every objects
2024-06-06 19:23:14 +02:00
1F616EMO~nya
fcd321448f
Support ATMs and WTT from Unified Money (#372)
* Support ATMs and WTT from Unified Money

* Return L.icon(...)
2024-06-06 19:21:00 +02:00
renovate[bot]
e667ca580a chore(deps): update actions/checkout action to v4 2023-12-29 16:09:47 +01:00
renovate[bot]
86f0a74542 fix(deps): update module github.com/minetest-go/colormapping to v1.0.3 2023-12-29 16:08:55 +01:00
renovate[bot]
9458b269b3 fix(deps): update module github.com/yuin/gopher-lua to v1.1.1 2023-12-29 16:08:49 +01:00
renovate[bot]
eed72a199d chore(deps): update dependency ubuntu to v22 2023-12-29 16:08:38 +01:00
renovate[bot]
a58afe86d0 chore(deps): update docker/login-action action to v3 2023-12-29 16:08:24 +01:00
renovate[bot]
5cc3a97362 fix(deps): update module github.com/prometheus/client_golang to v1.18.0 2023-12-29 16:08:06 +01:00
renovate[bot]
ce77416612 fix(deps): update module github.com/google/uuid to v1.5.0 2023-12-29 16:06:12 +01:00
renovate[bot]
fd1a15bf39 fix(deps): update module github.com/sirupsen/logrus to v1.9.3 2023-12-29 16:04:57 +01:00
renovate[bot]
14439407cf fix(deps): update dependency bootstrap to v5.3.2 2023-12-29 16:04:39 +01:00
renovate[bot]
2a9b895603 chore(deps): update actions/setup-node action to v4 2023-12-29 16:04:15 +01:00
renovate[bot]
c5fd436f09 chore(deps): update actions/setup-go action to v5 2023-12-29 16:03:48 +01:00
renovate[bot]
13752d45dc chore(deps): update dependency rollup to v4 2023-12-29 16:03:41 +01:00
BuckarooBanzay
2008e9e170 cleanup 2023-12-29 16:02:47 +01:00
BuckarooBanzay
b7486a4474 types / coords refactoring 2023-12-29 16:00:11 +01:00
renovate[bot]
1e1d0813e8 fix(deps): update module modernc.org/sqlite to v1.28.0 2023-12-27 10:48:16 +01:00
renovate[bot]
a8cd4dbaec fix(deps): update module github.com/prometheus/client_golang to v1.17.0 2023-12-27 10:47:50 +01:00
renovate[bot]
8ee29e14b3 fix(deps): update module github.com/stretchr/testify to v1.8.4 2023-12-27 10:47:34 +01:00
renovate[bot]
0750ebd453 fix(deps): update dependency vue to v2.7.16 2023-12-27 10:45:18 +01:00
renovate[bot]
728c49ea78 chore(deps): update dependency rollup to v3.29.4 2023-12-27 10:45:03 +01:00
renovate[bot]
9a4499fd24 Update shogo82148/actions-goveralls action to v1.8.0 2023-12-27 10:44:42 +01:00
renovate[bot]
5ca9d0c89e Update actions/setup-go action to v4.1.0 2023-12-27 10:44:35 +01:00
renovate[bot]
387dcb19c8 fix(deps): update dependency @fortawesome/fontawesome-free to v6.5.1 2023-12-27 10:44:26 +01:00
dependabot[bot]
4993951164 Bump postcss from 8.4.21 to 8.4.31 in /public
Bumps [postcss](https://github.com/postcss/postcss) from 8.4.21 to 8.4.31.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.4.21...8.4.31)

---
updated-dependencies:
- dependency-name: postcss
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-27 10:44:06 +01:00
renovate[bot]
fb0d4dc903 fix(deps): update module github.com/gorilla/websocket to v1.5.1 2023-12-27 10:43:19 +01:00
BuckarooBanzay
efb19739c6 add cascade to object-fk 2023-12-27 10:40:56 +01:00
Buckaroo Banzai
be38c83fd8
db cleanup (#341)
* db cleanup

* dev

* pg setup

* postgres uuid migration

* cleanup

* fk

* sqlite migration

* cleanup

* wal

* max open conns = 1

* fix panic

---------

Co-authored-by: BuckarooBanzay <BuckarooBanzay@users.noreply.github.com>
2023-12-27 10:35:24 +01:00
BuckarooBanzay
4583880a68 provide a default config for smaller setups (tested with 2 GB ram, peaks at 50%)
closes #96
2023-10-11 17:42:03 +02:00
BuckarooBanzay
28119bb1bf fix some issues 2023-10-11 17:35:39 +02:00
BuckarooBanzay
ecad16ae7e add option to disable cache 2023-10-11 17:33:41 +02:00
Niklp
0fd52738d0
Add support for custom colors.txt dir (#334) 2023-09-28 07:00:04 +02:00
BuckarooBanzay
073647a62a revert default mapserver.json file location to current dir 2023-09-21 07:19:18 +02:00
Nold
69b963ed6e
feat: added configuration options via Environment (#333) 2023-09-18 06:47:45 +02:00
Nold
2114ee5c32
feat(config): make WorldPath & DataPth configurable (#332) 2023-09-18 06:47:29 +02:00
renovate[bot]
53689acf53 Update actions/setup-go action to v4 2023-04-10 18:19:59 +02:00
renovate[bot]
9ef627ee32 Update module github.com/minetest-go/colormapping to v1.0.2 2023-04-10 18:19:51 +02:00
renovate[bot]
354a9f1909 Update module github.com/yuin/gopher-lua to v1.1.0 2023-04-10 12:19:12 +02:00
renovate[bot]
321811be23 Update dependency vue-router to v3.6.5 2023-04-10 12:17:53 +02:00
renovate[bot]
dbc21dcc72 Update golang Docker tag to v1.20.3 2023-04-10 12:17:44 +02:00
renovate[bot]
69d79c6175 Update dependency @fortawesome/fontawesome-free to v6.4.0 2023-04-10 12:17:24 +02:00
renovate[bot]
c728b278ea Update dependency bootstrap to v5.2.3 2023-04-10 12:17:17 +02:00
renovate[bot]
4a10d49aef Update dependency vue to v2.7.14 2023-04-10 12:17:11 +02:00
renovate[bot]
16562027b8 Update dependency vue-i18n to v8.28.2 2023-04-10 12:17:01 +02:00
renovate[bot]
02ae9960ea Update module github.com/stretchr/testify to v1.8.2 2023-04-10 12:16:26 +02:00
renovate[bot]
d35003ca48 Update goreleaser/goreleaser-action action to v4 2023-04-10 12:16:02 +02:00
renovate[bot]
64622ebbdf Update module modernc.org/sqlite to v1.21.1 2023-04-10 12:15:17 +02:00
renovate[bot]
0e2255b0c0 Update dependency rollup to v3.20.2 2023-04-10 12:15:10 +02:00
renovate[bot]
06bff41177 Update golang Docker tag to v1.20.2 2023-04-10 12:15:02 +02:00
Kenneth Watson
3f03fad4a7 Add Fishing Boat icon 2023-04-10 12:14:15 +02:00
renovate[bot]
9e5d48aa61 Update module github.com/sirupsen/logrus to v1.9.0 2023-01-21 12:43:54 +01:00
renovate[bot]
950cab2042 Update dependency rollup to v3 2023-01-21 12:43:48 +01:00
renovate[bot]
640839a095 Update docker/login-action action to v2 2023-01-21 12:43:41 +01:00
renovate[bot]
5335c5ea78 Update postgres Docker tag to v15 2023-01-21 12:43:34 +01:00
renovate[bot]
8a2d710c54 Update module github.com/yuin/gopher-lua to v1 2023-01-21 12:43:10 +01:00
renovate[bot]
49abfcf38b Update golang Docker tag to v1.19.5 2023-01-21 12:42:57 +01:00
renovate[bot]
705be52604 Update goreleaser/goreleaser-action action to v3 2023-01-21 12:42:51 +01:00
renovate[bot]
871b168a54 Update module github.com/minetest-go/colormapping to v1.0.1 2023-01-21 12:42:35 +01:00
BuckarooBanzay
201d983ac0 os.ReadFile 2023-01-20 18:04:27 +01:00
BuckarooBanzay
a4bd231cec go fixes 2023-01-20 18:02:52 +01:00
BuckarooBanzay
8634c8e763 remove unused colors 2023-01-20 18:02:37 +01:00
BuckarooBanzay
3aabb452b4 use colormapping repo 2023-01-20 17:44:59 +01:00
BuckarooBanzay
a9aab89f29 fix wal issue 2022-12-16 08:30:21 +01:00
BuckarooBanzay
dfbf203acb update mapserver_mod / config file 2022-12-16 08:25:45 +01:00
renovate[bot]
4e04be6ce1 Update module modernc.org/sqlite to v1.20.0 2022-12-16 08:23:58 +01:00
renovate[bot]
5674d70045 Update actions/cache action to v3 2022-12-16 08:22:27 +01:00
renovate[bot]
d91b562c26 Update module github.com/lib/pq to v1.10.7 2022-12-16 08:21:53 +01:00
renovate[bot]
de375c3d16 Update actions/setup-go action to v3.5.0 2022-12-16 08:21:44 +01:00
renovate[bot]
547a324e67 Update dependency jshint to v2.13.6 2022-12-16 08:20:44 +01:00
renovate[bot]
4b3b6c9332 Update github.com/yuin/gopher-lua digest to 3323424 2022-12-16 08:19:45 +01:00
dependabot[bot]
e6da874d16 Bump minimatch from 3.0.4 to 3.0.8 in /public
Bumps [minimatch](https://github.com/isaacs/minimatch) from 3.0.4 to 3.0.8.
- [Release notes](https://github.com/isaacs/minimatch/releases)
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/minimatch/compare/v3.0.4...v3.0.8)

---
updated-dependencies:
- dependency-name: minimatch
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-16 08:17:53 +01:00
renovate[bot]
06a165196d Update golang Docker tag to v1.19.4 2022-12-16 08:16:53 +01:00
renovate[bot]
fedcee514c Update dependency rollup to v2.79.1 2022-12-16 08:16:12 +01:00
renovate[bot]
7d6c8bdce2 Update module github.com/minetest-go/mapparser to v0.1.8 2022-12-16 08:16:05 +01:00
renovate[bot]
3f8f0ae5ca Update module github.com/prometheus/client_golang to v1.14.0 2022-12-16 08:15:50 +01:00
renovate[bot]
5861eafc55 Update registry.gitlab.com/minetest/minetest/server Docker tag to v5.6.1 2022-12-16 08:15:43 +01:00
renovate[bot]
aba317e5ff Update module github.com/stretchr/testify to v1.8.1 2022-12-16 08:15:35 +01:00
BuckarooBanzay
43fb542fc1 build workflow fix (don't run docker login in PR's) 2022-12-16 08:12:57 +01:00
Kenneth Watson
7e8dcdc77b
Add support for player skins via SkinsDB (#284)
* Add support for player skins via SkinsDB

* Fix jshint complaints
2022-12-16 08:07:47 +01:00
Kenneth Watson
67114e1ea3
Add player look direction and movement indicator (#283) 2022-12-13 19:40:26 +01:00
Kenneth Watson
cd5ce67f10
Update Natural Biomes colours (#282) 2022-12-10 20:08:08 +01:00
Buckaroo Banzai
46b5b2ae35
fix buildig doc (thanks Juri#8208) 2022-11-20 19:33:04 +01:00
Kenneth Watson
4fa3f46626 Add some missed Natural Biome nodes 2022-10-30 19:01:12 +01:00
Kenneth Watson
801298460e Add Natural Biomes colour mapping 2022-10-30 19:01:12 +01:00
BuckarooBanzay
98279eec40 fix rollup-error and use commonjs for the rollup-config 2022-10-18 06:34:09 +02:00
Kenneth Watson
f3b3e189b0 Fix missing type mappings for basic advtrains 2022-10-02 18:54:06 +02:00
Kenneth Watson
9943d62dc4 Bump Go version to support Time.UnixMicro 2022-08-14 12:23:24 +02:00
Kenneth Watson
84253939c4 Add support for realtime APercy Airutils-based planes 2022-08-14 12:23:24 +02:00
ainola
2c4ee1d130 Fix mispelling 2022-07-24 09:56:27 +02:00
Renovate Bot
e803dbe90c Update dependency @fortawesome/fontawesome-free to v6 2022-03-19 17:25:42 +01:00
Renovate Bot
fa2abb5a8b Update dependency rollup to v2.70.1 2022-03-19 17:25:29 +01:00
Renovate Bot
baadd3e8cb Update module github.com/stretchr/testify to v1.7.1 2022-03-19 17:24:55 +01:00
Renovate Bot
8eecb07ba0 Update shogo82148/actions-goveralls action to v1.6.0 2022-03-19 17:24:44 +01:00
BuckarooBanzay
b16713de56 improved static file handling and caching 2022-03-19 17:23:18 +01:00
BuckarooBanzay
9789c4c467 remove stats fragment 2022-03-19 17:17:51 +01:00
BuckarooBanzay
4c0bd29d9f simpler js bootstrap 2022-03-19 17:15:19 +01:00
Renovate Bot
4f61067cf2 Update actions/checkout action to v3 2022-03-06 11:58:24 +01:00
Renovate Bot
ec28e9c973 Update dependency rollup to v2.69.2 2022-03-06 11:58:14 +01:00
Renovate Bot
7d36a21282 Update dependency golang to v1.17.8 2022-03-06 11:57:15 +01:00
Renovate Bot
d5258b0d22 Update actions/setup-node action to v3 2022-03-06 11:56:53 +01:00
Renovate Bot
a445e363c7 Update module github.com/gorilla/websocket to v1.5.0 2022-03-06 11:56:34 +01:00
Renovate Bot
3f86c95862 Update module modernc.org/sqlite to v1.14.8 2022-03-06 11:56:08 +01:00
Renovate Bot
f40d348a8b Update actions/setup-go action to v3 2022-03-06 11:55:54 +01:00
BuckarooBanzay
329cb6fcdf set timeout pragma
may fix #255
2022-03-06 11:52:40 +01:00
Dennis Jenkins
a70db7ad7c Correct minor spelling mistake in building.md 2022-02-10 07:39:35 +01:00
BuckarooBanzay
76c1a5e2f8 add fancy_travelnet:fancy_travelnet
fixes #247
2022-02-09 11:24:10 +01:00
BuckarooBanzay
847c087026 add nodecore colors 2022-02-05 16:02:47 +01:00
Renovate Bot
9fb7bec52b Update module modernc.org/sqlite to v1.14.6 2022-02-05 08:08:17 +01:00
BuckarooBanzay
4e44790ca2 overhaul dev/prod script loading 2022-02-05 08:05:55 +01:00
BuckarooBanzay
de2a105243 regen 2022-02-03 21:14:22 +01:00
BuckarooBanzay
0339d4a2ab Add @catz85 as a contributor 2022-02-03 21:12:50 +01:00
BuckarooBanzay
3a5114beb0 Add @shrimpza as a contributor 2022-02-03 21:12:33 +01:00
BuckarooBanzay
45d4a82064 Add @bmarwell as a contributor 2022-02-03 21:12:16 +01:00
BuckarooBanzay
fa8d1fb7c5 Add @cure as a contributor 2022-02-03 21:11:47 +01:00
BuckarooBanzay
fc35e4069d Add @crocsg as a contributor 2022-02-03 21:11:30 +01:00
BuckarooBanzay
ea31f96c92 Add @PeterNerlich as a contributor 2022-02-03 21:11:17 +01:00
BuckarooBanzay
7db3ac9e13 Add @pyrollo as a contributor 2022-02-03 21:11:05 +01:00
BuckarooBanzay
f10809b1f6 Add @BuckarooBanzay as a contributor 2022-02-03 21:10:08 +01:00
BuckarooBanzay
6646c1c84a contrib stuff 2022-02-03 21:09:12 +01:00
BuckarooBanzay
9c9b18eaa7 contributors table 2022-02-03 21:02:49 +01:00
allcontributors[bot]
e887ecb863
docs: add BuckarooBanzay as a contributor for code, infra, maintenance (#242)
* docs: update readme.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2022-02-03 20:59:46 +01:00
183 changed files with 2387 additions and 69019 deletions

View File

@ -1,14 +1,14 @@
{ {
"files": [
"readme.md"
],
"contributorsPerLine": 7,
"contributorsSortAlphabetically": false,
"skipCi": true,
"projectName": "mapserver", "projectName": "mapserver",
"projectOwner": "minetest-mapserver", "projectOwner": "minetest-mapserver",
"repoType": "github", "repoType": "github",
"repoHost": "https://github.com", "repoHost": "https://github.com",
"files": [
"readme.md"
],
"imageSize": 100,
"commit": true,
"commitConvention": "none",
"contributors": [ "contributors": [
{ {
"login": "BuckarooBanzay", "login": "BuckarooBanzay",
@ -16,10 +16,72 @@
"avatar_url": "https://avatars.githubusercontent.com/u/39065740?v=4", "avatar_url": "https://avatars.githubusercontent.com/u/39065740?v=4",
"profile": "https://github.com/BuckarooBanzay", "profile": "https://github.com/BuckarooBanzay",
"contributions": [ "contributions": [
"code", "code"
"infra", ]
"maintenance" },
{
"login": "pyrollo",
"name": "Pierre-Yves Rollo",
"avatar_url": "https://avatars.githubusercontent.com/u/13189280?v=4",
"profile": "http://photo.pyrollo.com/",
"contributions": [
"code"
]
},
{
"login": "PeterNerlich",
"name": "Peter Nerlich",
"avatar_url": "https://avatars.githubusercontent.com/u/10530729?v=4",
"profile": "http://peter.nerlich4u.de/",
"contributions": [
"code"
]
},
{
"login": "crocsg",
"name": "StephaneG",
"avatar_url": "https://avatars.githubusercontent.com/u/34553036?v=4",
"profile": "https://github.com/crocsg",
"contributions": [
"code"
]
},
{
"login": "cure",
"name": "Ward Vandewege",
"avatar_url": "https://avatars.githubusercontent.com/u/149135?v=4",
"profile": "https://arvados.org/",
"contributions": [
"code"
]
},
{
"login": "bmarwell",
"name": "Benjamin Marwell",
"avatar_url": "https://avatars.githubusercontent.com/u/1413391?v=4",
"profile": "https://blog.bmarwell.de/",
"contributions": [
"doc"
]
},
{
"login": "shrimpza",
"name": "Kenneth Watson",
"avatar_url": "https://avatars.githubusercontent.com/u/6191747?v=4",
"profile": "https://shrimpworks.za.net/",
"contributions": [
"code"
]
},
{
"login": "catz85",
"name": "3C",
"avatar_url": "https://avatars.githubusercontent.com/u/5050513?v=4",
"profile": "https://github.com/catz85",
"contributions": [
"code"
] ]
} }
] ],
"contributorsPerLine": 7
} }

View File

@ -13,17 +13,17 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Set up Go - name: Set up Go
uses: actions/setup-go@v2.1.5 uses: actions/setup-go@v5.0.1
with: with:
go-version: 1.16 go-version: "1.22"
- name: Set up nodejs - name: Set up nodejs
uses: actions/setup-node@v2 uses: actions/setup-node@v4
with: with:
node-version: '17' node-version: '17'
@ -31,7 +31,7 @@ jobs:
run: cd public && npm ci && npm run bundle run: cd public && npm ci && npm run bundle
- name: Cache Go modules - name: Cache Go modules
uses: actions/cache@v2 uses: actions/cache@v4
with: with:
path: ~/go/pkg/mod path: ~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
@ -42,24 +42,12 @@ jobs:
run: | run: |
go test ./... go test ./...
- name: Docker Login # only on tags
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Run GoReleaser - name: Run GoReleaser
uses: goreleaser/goreleaser-action@v2 uses: goreleaser/goreleaser-action@v6
if: success() && startsWith(github.ref, 'refs/tags/') if: success() && startsWith(github.ref, 'refs/tags/')
with: with:
version: latest version: latest
args: release --rm-dist args: release --clean
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push latest docker image
if: success() && github.ref == 'refs/heads/master'
run: |
CGO_ENABLED=0 go build .
docker build . -t minetestmapserver/mapserver:latest
docker push minetestmapserver/mapserver:latest

39
.github/workflows/docker.yml vendored Normal file
View File

@ -0,0 +1,39 @@
name: docker
on:
push:
branches:
- 'main'
tags:
- 'v*'
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/minetest-mapserver/mapserver
- name: Log in to the Container registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

View File

@ -5,17 +5,17 @@ on: [push, pull_request]
jobs: jobs:
build: build:
runs-on: ubuntu-20.04 runs-on: ubuntu-22.04
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
- uses: actions/setup-go@v2.1.5 - uses: actions/setup-go@v5.0.1
with: with:
go-version: '1.16' go-version: '1.21'
- name: test - name: test
run: go test ./... -coverprofile=profile.cov run: go test ./... -coverprofile=profile.cov
- uses: shogo82148/actions-goveralls@v1.5.1 - uses: shogo82148/actions-goveralls@v1.9.0
with: with:
path-to-profile: profile.cov path-to-profile: profile.cov

View File

@ -5,13 +5,13 @@ on: [push, pull_request]
jobs: jobs:
build: build:
runs-on: ubuntu-20.04 runs-on: ubuntu-22.04
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
- name: Set up nodejs - name: Set up nodejs
uses: actions/setup-node@v2 uses: actions/setup-node@v4
with: with:
node-version: '17' node-version: '17'

View File

@ -1,24 +1,13 @@
before:
hooks:
- go mod tidy
builds: builds:
- env: - env:
- CGO_ENABLED=0 - CGO_ENABLED=0
targets: goos:
- linux_amd64 - linux
- windows_amd64 - windows
- darwin_arm64 goarch:
- linux_arm_6 - amd64
- arm64
ldflags: ldflags:
- -s -w -X mapserver/app.Version={{.Version}} - -s -w -X mapserver/app.Version={{.Version}}
changelog: changelog:
sort: asc sort: asc
filters:
exclude:
- '^docs:'
- '^test:'
dockers:
- image_templates:
- "minetestmapserver/mapserver:{{ .Version }}"
- "minetestmapserver/mapserver:latest"
dockerfile: Dockerfile

View File

@ -1,4 +1,18 @@
FROM scratch FROM node:20.15.0 as bundle-builder
COPY mapserver /bin/mapserver COPY public /public
WORKDIR /public
RUN npm ci && npm run bundle
FROM golang:1.22.4 as go-builder
COPY . /data
COPY --from=bundle-builder /public/js/bundle* /data/public/js/
WORKDIR /data
RUN CGO_ENABLED=0 go build .
FROM alpine:3.20.1
COPY --from=go-builder /data/mapserver /bin/mapserver
ENV MT_CONFIG_PATH "mapserver.json"
ENV MT_LOGLEVEL "INFO"
ENV MT_READONLY "false"
EXPOSE 8080 EXPOSE 8080
ENTRYPOINT ["/bin/mapserver"] ENTRYPOINT ["/bin/mapserver"]

View File

@ -1,8 +1,6 @@
package app package app
import ( import (
"mapserver/blockaccessor"
"mapserver/colormapping"
"mapserver/db" "mapserver/db"
"mapserver/eventbus" "mapserver/eventbus"
"mapserver/mapblockaccessor" "mapserver/mapblockaccessor"
@ -12,6 +10,8 @@ import (
"mapserver/settings" "mapserver/settings"
"mapserver/tiledb" "mapserver/tiledb"
"mapserver/tilerenderer" "mapserver/tilerenderer"
"github.com/minetest-go/colormapping"
) )
type App struct { type App struct {
@ -25,7 +25,6 @@ type App struct {
Settings settings.Settings Settings settings.Settings
MapBlockAccessor *mapblockaccessor.MapBlockAccessor MapBlockAccessor *mapblockaccessor.MapBlockAccessor
BlockAccessor *blockaccessor.BlockAccessor
Colormapping *colormapping.ColorMapping Colormapping *colormapping.ColorMapping
Mapblockrenderer *mapblockrenderer.MapBlockRenderer Mapblockrenderer *mapblockrenderer.MapBlockRenderer
Tilerenderer *tilerenderer.TileRenderer Tilerenderer *tilerenderer.TileRenderer

View File

@ -2,8 +2,7 @@ package app
import ( import (
"encoding/json" "encoding/json"
"io/ioutil" "mapserver/types"
"mapserver/layer"
"os" "os"
"runtime" "runtime"
"sync" "sync"
@ -44,14 +43,13 @@ func ParseConfig(filename string) (*Config, error) {
SecretKey: RandStringRunes(16), SecretKey: RandStringRunes(16),
} }
layers := []*layer.Layer{ layers := []*types.Layer{
&layer.Layer{ {
Id: 0, Id: 0,
Name: "Ground", Name: "Ground",
From: -1, From: -1,
To: 10, To: 10,
}, }, {
&layer.Layer{
Id: 1, Id: 1,
Name: "Sky", Name: "Sky",
From: 11, From: 11,
@ -60,41 +58,44 @@ func ParseConfig(filename string) (*Config, error) {
} }
mapobjs := MapObjectConfig{ mapobjs := MapObjectConfig{
Areas: true, Areas: true,
Bones: true, Bones: true,
Protector: true, Protector: true,
XPProtector: true, XPProtector: true,
PrivProtector: true, PrivProtector: true,
TechnicQuarry: true, TechnicQuarry: true,
TechnicSwitch: true, TechnicSwitch: true,
TechnicAnchor: true, TechnicAnchor: true,
TechnicReactor: true, TechnicReactor: true,
LuaController: true, LuaController: true,
Digiterms: true, Digiterms: true,
Digilines: true, Digilines: true,
Travelnet: true, Travelnet: true,
MapserverPlayer: true, MapserverPlayer: true,
MapserverPOI: true, MapserverPOI: true,
MapserverLabel: true, MapserverLabel: true,
MapserverTrainline: true, MapserverTrainline: true,
MapserverBorder: true, MapserverBorder: true,
TileServerLegacy: true, TileServerLegacy: true,
Mission: true, Mission: true,
Jumpdrive: true, Jumpdrive: true,
Smartshop: true, Smartshop: true,
Fancyvend: true, Fancyvend: true,
ATM: true, ATM: true,
Train: true, Train: true,
TrainSignal: true, TrainSignal: true,
Minecart: false, Minecart: false,
Locator: false, Locator: false,
Signs: true, Signs: true,
MapserverAirutils: true,
UnifiefMoneyAreaForSale: true,
Phonograph: true,
} }
mapblockaccessor := MapBlockAccessorConfig{ mapblockaccessor := MapBlockAccessorConfig{
Expiretime: "15s", Expiretime: "10s",
Purgetime: "30s", Purgetime: "15s",
MaxItems: 500, MaxItems: 50,
} }
defaultoverlays := []string{ defaultoverlays := []string{
@ -103,6 +104,11 @@ func ParseConfig(filename string) (*Config, error) {
"mapserver_player", "mapserver_player",
} }
skins := SkinsConfig{
EnableSkinsDB: false,
SkinsPath: "",
}
cfg := Config{ cfg := Config{
ConfigVersion: 1, ConfigVersion: 1,
Port: 8080, Port: 8080,
@ -115,18 +121,22 @@ func ParseConfig(filename string) (*Config, error) {
Webdev: false, Webdev: false,
WebApi: &webapi, WebApi: &webapi,
Layers: layers, Layers: layers,
RenderingFetchLimit: 10000, RenderingFetchLimit: 500,
RenderingJobs: runtime.NumCPU(), RenderingJobs: runtime.NumCPU(),
RenderingQueue: 100, RenderingQueue: 10,
IncrementalRenderingTimer: "5s", IncrementalRenderingTimer: "5s",
MapObjects: &mapobjs, MapObjects: &mapobjs,
MapBlockAccessorCfg: &mapblockaccessor, MapBlockAccessorCfg: &mapblockaccessor,
DefaultOverlays: defaultoverlays, DefaultOverlays: defaultoverlays,
Skins: &skins,
WorldPath: "./",
DataPath: "./",
ColorsTxtPath: "./",
} }
info, err := os.Stat(filename) info, err := os.Stat(filename)
if info != nil && err == nil { if info != nil && err == nil {
data, err := ioutil.ReadFile(filename) data, err := os.ReadFile(filename)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -1,8 +1,6 @@
package app package app
import ( import (
"mapserver/blockaccessor"
"mapserver/colormapping"
"mapserver/db/postgres" "mapserver/db/postgres"
"mapserver/db/sqlite" "mapserver/db/sqlite"
"mapserver/eventbus" "mapserver/eventbus"
@ -18,8 +16,10 @@ import (
"mapserver/worldconfig" "mapserver/worldconfig"
"time" "time"
"io/ioutil" "github.com/minetest-go/colormapping"
"os" "os"
"path/filepath"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
@ -33,14 +33,14 @@ func Setup(p params.ParamsType, cfg *Config) *App {
a.WebEventbus = eventbus.New() a.WebEventbus = eventbus.New()
//Parse world config //Parse world config
a.Worldconfig = worldconfig.Parse("world.mt") a.Worldconfig = worldconfig.Parse(filepath.Join(a.Config.WorldPath, "world.mt"))
logrus.WithFields(logrus.Fields{"version": Version}).Info("Starting mapserver") logrus.WithFields(logrus.Fields{"version": Version}).Info("Starting mapserver")
var err error var err error
switch a.Worldconfig[worldconfig.CONFIG_BACKEND] { switch a.Worldconfig[worldconfig.CONFIG_BACKEND] {
case worldconfig.BACKEND_SQLITE3: case worldconfig.BACKEND_SQLITE3:
map_path := "map.sqlite" map_path := filepath.Join(a.Config.WorldPath, "map.sqlite")
// check if the database exists, otherwise abort (nothing to render/display) // check if the database exists, otherwise abort (nothing to render/display)
_, err := os.Stat(map_path) _, err := os.Stat(map_path)
@ -88,36 +88,19 @@ func Setup(p params.ParamsType, cfg *Config) *App {
expireDuration, purgeDuration, expireDuration, purgeDuration,
cfg.MapBlockAccessorCfg.MaxItems) cfg.MapBlockAccessorCfg.MaxItems)
// block accessor
a.BlockAccessor = blockaccessor.New(a.MapBlockAccessor)
//color mapping //color mapping
a.Colormapping = colormapping.NewColorMapping() a.Colormapping = colormapping.NewColorMapping()
err = a.Colormapping.LoadDefaults()
colorfiles := []string{ if err != nil {
//https://daconcepts.com/vanessa/hobbies/minetest/colors.txt panic(err)
"colors/vanessa.txt",
"colors/advtrains.txt",
"colors/scifi_nodes.txt",
"colors/mc2.txt",
"colors/mtg.txt",
"colors/miles.txt",
"colors/custom.txt",
}
for _, colorfile := range colorfiles {
_, err := a.Colormapping.LoadVFSColors(colorfile)
if err != nil {
panic(err.Error() + " file:" + colorfile)
}
} }
//load provided colors, if available //load provided colors, if available
info, err := os.Stat("colors.txt") info, err := os.Stat(filepath.Join(a.Config.ColorsTxtPath, "colors.txt"))
if info != nil && err == nil { if info != nil && err == nil {
logrus.WithFields(logrus.Fields{"filename": "colors.txt"}).Info("Loading colors from filesystem") logrus.WithFields(logrus.Fields{"filename": "colors.txt"}).Info("Loading colors from filesystem")
data, err := ioutil.ReadFile("colors.txt") data, err := os.ReadFile(filepath.Join(a.Config.ColorsTxtPath, "colors.txt"))
if err != nil { if err != nil {
panic(err) panic(err)
} }
@ -138,7 +121,7 @@ func Setup(p params.ParamsType, cfg *Config) *App {
if a.Worldconfig[worldconfig.CONFIG_PSQL_MAPSERVER] != "" { if a.Worldconfig[worldconfig.CONFIG_PSQL_MAPSERVER] != "" {
a.Objectdb, err = postgresobjdb.New(a.Worldconfig[worldconfig.CONFIG_PSQL_MAPSERVER]) a.Objectdb, err = postgresobjdb.New(a.Worldconfig[worldconfig.CONFIG_PSQL_MAPSERVER])
} else { } else {
a.Objectdb, err = sqliteobjdb.New("mapserver.sqlite") a.Objectdb, err = sqliteobjdb.New(filepath.Join(a.Config.DataPath, "mapserver.sqlite"))
} }
if err != nil { if err != nil {
@ -153,7 +136,7 @@ func Setup(p params.ParamsType, cfg *Config) *App {
} }
//create tiledb //create tiledb
a.TileDB, err = tiledb.New("./mapserver.tiles") a.TileDB, err = tiledb.New(filepath.Join(a.Config.DataPath, "mapserver.tiles"))
if err != nil { if err != nil {
panic(err) panic(err)

View File

@ -1,8 +1,6 @@
package app package app
import ( import "mapserver/types"
"mapserver/layer"
)
type Config struct { type Config struct {
ConfigVersion int `json:"configversion"` ConfigVersion int `json:"configversion"`
@ -15,7 +13,7 @@ type Config struct {
EnableMediaRepository bool `json:"enablemediarepository"` EnableMediaRepository bool `json:"enablemediarepository"`
Webdev bool `json:"webdev"` Webdev bool `json:"webdev"`
WebApi *WebApiConfig `json:"webapi"` WebApi *WebApiConfig `json:"webapi"`
Layers []*layer.Layer `json:"layers"` Layers []*types.Layer `json:"layers"`
RenderingFetchLimit int `json:"renderingfetchlimit"` RenderingFetchLimit int `json:"renderingfetchlimit"`
RenderingJobs int `json:"renderingjobs"` RenderingJobs int `json:"renderingjobs"`
RenderingQueue int `json:"renderingqueue"` RenderingQueue int `json:"renderingqueue"`
@ -23,6 +21,10 @@ type Config struct {
MapObjects *MapObjectConfig `json:"mapobjects"` MapObjects *MapObjectConfig `json:"mapobjects"`
MapBlockAccessorCfg *MapBlockAccessorConfig `json:"mapblockaccessor"` MapBlockAccessorCfg *MapBlockAccessorConfig `json:"mapblockaccessor"`
DefaultOverlays []string `json:"defaultoverlays"` DefaultOverlays []string `json:"defaultoverlays"`
Skins *SkinsConfig `json:"skins"`
WorldPath string `json:"worldpath"`
DataPath string `json:"datapath"`
ColorsTxtPath string `json:"colorstxtpath"`
} }
type MapBlockAccessorConfig struct { type MapBlockAccessorConfig struct {
@ -32,35 +34,38 @@ type MapBlockAccessorConfig struct {
} }
type MapObjectConfig struct { type MapObjectConfig struct {
Areas bool `json:"areas"` Areas bool `json:"areas"`
Bones bool `json:"bones"` Bones bool `json:"bones"`
Protector bool `json:"protector"` Protector bool `json:"protector"`
XPProtector bool `json:"xpprotector"` XPProtector bool `json:"xpprotector"`
PrivProtector bool `json:"privprotector"` PrivProtector bool `json:"privprotector"`
TechnicQuarry bool `json:"technic_quarry"` TechnicQuarry bool `json:"technic_quarry"`
TechnicSwitch bool `json:"technic_switch"` TechnicSwitch bool `json:"technic_switch"`
TechnicAnchor bool `json:"technic_anchor"` TechnicAnchor bool `json:"technic_anchor"`
TechnicReactor bool `json:"technic_reactor"` TechnicReactor bool `json:"technic_reactor"`
LuaController bool `json:"luacontroller"` LuaController bool `json:"luacontroller"`
Digiterms bool `json:"digiterms"` Digiterms bool `json:"digiterms"`
Digilines bool `json:"digilines"` Digilines bool `json:"digilines"`
Travelnet bool `json:"travelnet"` Travelnet bool `json:"travelnet"`
MapserverPlayer bool `json:"mapserver_player"` MapserverPlayer bool `json:"mapserver_player"`
MapserverPOI bool `json:"mapserver_poi"` MapserverPOI bool `json:"mapserver_poi"`
MapserverLabel bool `json:"mapserver_label"` MapserverLabel bool `json:"mapserver_label"`
MapserverTrainline bool `json:"mapserver_trainline"` MapserverTrainline bool `json:"mapserver_trainline"`
MapserverBorder bool `json:"mapserver_border"` MapserverBorder bool `json:"mapserver_border"`
TileServerLegacy bool `json:"tileserverlegacy"` TileServerLegacy bool `json:"tileserverlegacy"`
Mission bool `json:"mission"` Mission bool `json:"mission"`
Jumpdrive bool `json:"jumpdrive"` Jumpdrive bool `json:"jumpdrive"`
Smartshop bool `json:"smartshop"` Smartshop bool `json:"smartshop"`
Fancyvend bool `json:"fancyvend"` Fancyvend bool `json:"fancyvend"`
ATM bool `json:"atm"` ATM bool `json:"atm"`
Train bool `json:"train"` Train bool `json:"train"`
TrainSignal bool `json:"trainsignal"` TrainSignal bool `json:"trainsignal"`
Minecart bool `json:"minecart"` Minecart bool `json:"minecart"`
Locator bool `json:"locator"` Locator bool `json:"locator"`
Signs bool `json:"signs"` Signs bool `json:"signs"`
MapserverAirutils bool `json:"mapserver_airutils"`
Phonograph bool `json:"phonograph"`
UnifiefMoneyAreaForSale bool `json:"um_area_forsale"`
} }
type WebApiConfig struct { type WebApiConfig struct {
@ -70,3 +75,8 @@ type WebApiConfig struct {
//mod http bridge secret //mod http bridge secret
SecretKey string `json:"secretkey"` SecretKey string `json:"secretkey"`
} }
type SkinsConfig struct {
EnableSkinsDB bool `json:"enableskinsdb"`
SkinsPath string `json:"skinspath"`
}

View File

@ -1,57 +0,0 @@
package areasparser
import (
"bytes"
"encoding/json"
"io/ioutil"
)
type GenericPos struct {
X int `json:"x"`
Y int `json:"y"`
Z int `json:"z"`
}
type Area struct {
Owner string `json:"owner"`
Name string `json:"name"`
Parent int `json:"parent"`
Pos1 *GenericPos `json:"pos1"`
Pos2 *GenericPos `json:"pos2"`
}
func getInt(o interface{}) int {
v, _ := o.(float64)
return int(v)
}
func (pos *GenericPos) UnmarshalJSON(data []byte) error {
m := make(map[string]interface{})
err := json.Unmarshal(data, &m)
if err != nil {
return err
}
// float-like to int workaround
pos.X = getInt(m["x"])
pos.Y = getInt(m["y"])
pos.Z = getInt(m["z"])
return nil
}
func ParseFile(filename string) ([]*Area, error) {
content, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
return Parse(content)
}
func Parse(data []byte) ([]*Area, error) {
areas := make([]*Area, 0)
json.NewDecoder(bytes.NewReader(data)).Decode(&areas)
return areas, nil
}

View File

@ -1,20 +0,0 @@
package areasparser
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestParse(t *testing.T) {
a, err := ParseFile("testdata/areas.json")
assert.NoError(t, err)
assert.True(t, len(a) > 1)
area := a[0]
assert.Equal(t, "ilai_house", area.Name)
assert.Equal(t, "ilai", area.Owner)
assert.NotNil(t, area.Pos1)
assert.NotNil(t, area.Pos2)
assert.Equal(t, 4970, area.Pos1.X)
}

View File

@ -1,323 +0,0 @@
[
{
"name": "ilai_house",
"owner": "ilai",
"pos1": {
"x": 4970.0,
"y": 8.0,
"z": 88.0
},
"pos2": {
"x": 4983.0,
"y": 16.0,
"z": 99.0
}
},
{
"name": "temple",
"owner": "Lukc",
"pos1": {
"x": -1911.0,
"y": 18.0,
"z": -221.0
},
"pos2": {
"x": -1718.0,
"y": 68.0,
"z": -50.0
}
},
{
"name": "temple",
"owner": "BuckarooBanzai",
"parent": 2.0,
"pos1": {
"x": -1911.0,
"y": 18.0,
"z": -221.0
},
"pos2": {
"x": -1718.0,
"y": 68.0,
"z": -50.0
}
},
{
"name": "Spaceshipyard",
"owner": "Lukc",
"pos1": {
"x": -1784.0,
"y": -49.0,
"z": -1174.0
},
"pos2": {
"x": -1688.0,
"y": 58.0,
"z": -1068.0
}
},
{
"name": "Arena",
"owner": "Lukc",
"pos1": {
"x": -1860.0,
"y": -369.0,
"z": -1162.0
},
"pos2": {
"x": -1751.0,
"y": -310.0,
"z": -1061.0
}
},
{
"name": "Spaceshipyard",
"owner": "T4im",
"parent": 4.0,
"pos1": {
"x": -1784.0,
"y": -49.0,
"z": -1174.0
},
"pos2": {
"x": -1688.0,
"y": 58.0,
"z": -1068.0
}
},
{
"name": "temple",
"owner": "T4im",
"parent": 2.0,
"pos1": {
"x": -1911.0,
"y": 18.0,
"z": -221.0
},
"pos2": {
"x": -1718.0,
"y": 68.0,
"z": -50.0
}
},
{
"name": "Spaceshipyard",
"owner": "BuckarooBanzai",
"parent": 4.0,
"pos1": {
"x": -1784.0,
"y": -49.0,
"z": -1174.0
},
"pos2": {
"x": -1688.0,
"y": 58.0,
"z": -1068.0
}
},
{
"name": "Arena",
"owner": "T4im",
"parent": 5.0,
"pos1": {
"x": -1860.0,
"y": -369.0,
"z": -1162.0
},
"pos2": {
"x": -1751.0,
"y": -310.0,
"z": -1061.0
}
},
{
"name": "Humboldt Research Station",
"owner": "T4im",
"pos1": {
"x": -624.0,
"y": -32.0,
"z": 48.0
},
"pos2": {
"x": -369.0,
"y": 127.0,
"z": 351.0
}
},
{
"name": "centrifuge cascade",
"owner": "pipo",
"pos1": {
"x": -2995.0,
"y": -40.0,
"z": -3003.0
},
"pos2": {
"x": -2958.0,
"y": -26.0,
"z": -2990.0
}
},
{
"name": "centrifuge cascade",
"owner": "barsik",
"parent": 11.0,
"pos1": {
"x": -2995.0,
"y": -40.0,
"z": -3003.0
},
"pos2": {
"x": -2958.0,
"y": -26.0,
"z": -2990.0
}
},
{
"name": "centrifuge cascade",
"owner": "BuckarooBanzai",
"parent": 11.0,
"pos1": {
"x": -2995.0,
"y": -40.0,
"z": -3003.0
},
"pos2": {
"x": -2958.0,
"y": -26.0,
"z": -2990.0
}
},
{
"name": "centrifuge cascade",
"owner": "T4im",
"parent": 11.0,
"pos1": {
"x": -2995.0,
"y": -40.0,
"z": -3003.0
},
"pos2": {
"x": -2958.0,
"y": -26.0,
"z": -2990.0
}
},
{
"name": "centrifuge cascade",
"owner": "Lukc",
"parent": 11.0,
"pos1": {
"x": -2995.0,
"y": -40.0,
"z": -3003.0
},
"pos2": {
"x": -2958.0,
"y": -26.0,
"z": -2990.0
}
},
{
"name": "Spaceshipyard",
"owner": "pipo",
"parent": 6.0,
"pos1": {
"x": -1784.0,
"y": -49.0,
"z": -1174.0
},
"pos2": {
"x": -1688.0,
"y": 58.0,
"z": -1068.0
}
},
{
"name": "Emerald extention",
"owner": "Emerald",
"pos1": {
"x": 5055.0,
"y": 8.0,
"z": 48.0
},
"pos2": {
"x": 5059.0,
"y": 10.0,
"z": 54.0
}
},
{
"name": "tower1",
"owner": "pipo",
"parent": 19.0,
"pos1": {
"x": -14.0,
"y": -126.0,
"z": 587.0
},
"pos2": {
"x": 17.0,
"y": 103.0,
"z": 617.0
}
},
{
"name": "tower1",
"owner": "barsik",
"pos1": {
"x": -14.0,
"y": -126.0,
"z": 587.0
},
"pos2": {
"x": 17.0,
"y": 103.0,
"z": 617.0
}
},
{
"name": "tower1",
"owner": "BuckarooBanzai",
"parent": 19.0,
"pos1": {
"x": -14.0,
"y": -126.0,
"z": 587.0
},
"pos2": {
"x": 17.0,
"y": 103.0,
"z": 617.0
}
},
{
"name": "tower1",
"owner": "T4im",
"parent": 19.0,
"pos1": {
"x": -14.0,
"y": -126.0,
"z": 587.0
},
"pos2": {
"x": 17.0,
"y": 103.0,
"z": 617.0
}
},
{
"name": "Arboretum",
"owner": "pipo",
"pos1": {
"x": -1734.0,
"y": 7.0,
"z": 697.0
},
"pos2": {
"x": -1604.0,
"y": 50.0,
"z": 784.0
}
}
]

View File

@ -1,43 +0,0 @@
package blockaccessor
import (
"mapserver/coords"
"mapserver/mapblockaccessor"
)
func New(mba *mapblockaccessor.MapBlockAccessor) *BlockAccessor {
return &BlockAccessor{mba: mba}
}
type BlockAccessor struct {
mba *mapblockaccessor.MapBlockAccessor
}
type Block struct {
Name string
//TODO: param1, param2
}
func (this *BlockAccessor) GetBlock(x, y, z int) (*Block, error) {
mbc := coords.NewMapBlockCoordsFromBlock(x, y, z)
mapblock, err := this.mba.GetMapBlock(mbc)
if err != nil {
return nil, err
}
if mapblock == nil {
return nil, nil
}
relx := x % 16
rely := y % 16
relz := z % 16
block := Block{
Name: mapblock.GetNodeName(relx, rely, relz),
}
return &block, nil
}

View File

@ -1,59 +0,0 @@
package blockaccessor
import (
"fmt"
"io/ioutil"
"mapserver/db/sqlite"
"mapserver/mapblockaccessor"
"mapserver/testutils"
"os"
"testing"
"time"
"github.com/sirupsen/logrus"
)
func TestSimpleAccess(t *testing.T) {
logrus.SetLevel(logrus.DebugLevel)
tmpfile, err := ioutil.TempFile("", "TestMigrate.*.sqlite")
if err != nil {
panic(err)
}
defer os.Remove(tmpfile.Name())
testutils.CreateTestDatabase(tmpfile.Name())
a, err := sqlite.New(tmpfile.Name())
if err != nil {
panic(err)
}
err = a.Migrate()
if err != nil {
panic(err)
}
mba := mapblockaccessor.NewMapBlockAccessor(a, 500*time.Millisecond, 1000*time.Millisecond, 1000)
if mba == nil {
t.Fatal("Mapblockaccessor is nil")
}
ba := New(mba)
if ba == nil {
t.Fatal("blockaccessor is nil")
}
block, err := ba.GetBlock(0, 2, 0)
if err != nil {
panic(err)
}
if block == nil {
t.Fatal("block is nil")
}
fmt.Println(block.Name)
}

View File

@ -1,148 +0,0 @@
package colormapping
import (
"bufio"
"bytes"
"errors"
"image/color"
"mapserver/public"
"strconv"
"strings"
"github.com/sirupsen/logrus"
)
type ColorMapping struct {
colors map[string]*color.RGBA
extendedpaletteblock map[string]bool
extendedpalette *Palette
}
func (m *ColorMapping) GetColor(name string, param2 int) *color.RGBA {
//TODO: list of node->palette
if m.extendedpaletteblock[name] {
// param2 coloring
return m.extendedpalette.GetColor(param2)
}
return m.colors[name]
}
func (m *ColorMapping) GetColors() map[string]*color.RGBA {
return m.colors
}
func (m *ColorMapping) LoadBytes(buffer []byte) (int, error) {
scanner := bufio.NewScanner(bytes.NewReader(buffer))
count := 0
line := 0
for scanner.Scan() {
line++
txt := strings.Trim(scanner.Text(), " ")
if len(txt) == 0 {
//empty
continue
}
if strings.HasPrefix(txt, "#") {
//comment
continue
}
parts := strings.Fields(txt)
if len(parts) < 4 {
return 0, errors.New("invalid line: #" + strconv.Itoa(line))
}
if len(parts) >= 4 {
r, err := strconv.ParseInt(parts[1], 10, 32)
if err != nil {
return 0, err
}
g, err := strconv.ParseInt(parts[2], 10, 32)
if err != nil {
return 0, err
}
b, err := strconv.ParseInt(parts[3], 10, 32)
if err != nil {
return 0, err
}
a := int64(255)
if len(parts) >= 5 {
//with alpha
//a, err = strconv.ParseInt(parts[4], 10, 32)
//if err != nil {
// return 0, err
//}
}
c := color.RGBA{uint8(r), uint8(g), uint8(b), uint8(a)}
m.colors[parts[0]] = &c
count++
}
}
return count, nil
}
func (m *ColorMapping) LoadVFSColors(filename string) (int, error) {
buffer, err := public.Files.ReadFile(filename)
if err != nil {
return 0, err
}
log.WithFields(logrus.Fields{"size": len(buffer),
"filename": filename,
}).Info("Loading colors")
return m.LoadBytes(buffer)
}
func NewColorMapping() *ColorMapping {
data, err := public.Files.ReadFile("pics/unifieddyes_palette_extended.png")
if err != nil {
panic(err)
}
extendedpalette, err := NewPalette(data)
if err != nil {
panic(err)
}
data, err = public.Files.ReadFile("extended_palette.txt")
if err != nil {
panic(err)
}
scanner := bufio.NewScanner(bytes.NewReader(data))
extendedpaletteblock := make(map[string]bool)
if err != nil {
panic(err)
}
for scanner.Scan() {
txt := strings.Trim(scanner.Text(), " ")
if len(txt) == 0 {
//empty
continue
}
extendedpaletteblock[txt] = true
}
return &ColorMapping{
colors: make(map[string]*color.RGBA),
extendedpaletteblock: extendedpaletteblock,
extendedpalette: extendedpalette,
}
}

View File

@ -1,38 +0,0 @@
package colormapping
import (
"testing"
)
func TestNewMapping(t *testing.T) {
m := NewColorMapping()
_, err := m.LoadVFSColors("colors/vanessa.txt")
if err != nil {
t.Fatal(err)
}
_, err = m.LoadVFSColors("colors/scifi_nodes.txt")
if err != nil {
t.Fatal(err)
}
c := m.GetColor("scifi_nodes:blacktile2", 0)
if c == nil {
panic("no color")
}
c = m.GetColor("default:river_water_flowing", 0)
if c == nil {
panic("no color")
}
c = m.GetColor("unifiedbricks:brickblock_multicolor_dark", 100)
if c == nil {
panic("no color")
}
//if c.A != 128 {
// panic("wrong alpha")
//}
}

View File

@ -1,11 +0,0 @@
package colormapping
import (
"github.com/sirupsen/logrus"
)
var log *logrus.Entry
func init() {
log = logrus.WithFields(logrus.Fields{"prefix": "colormapping"})
}

View File

@ -1,45 +0,0 @@
package colormapping
import (
"bytes"
"image/color"
"image/png"
)
type Palette struct {
colors map[int]*color.RGBA
}
func NewPalette(imagefile []byte) (*Palette, error) {
palette := &Palette{
colors: make(map[int]*color.RGBA),
}
reader := bytes.NewReader(imagefile)
img, err := png.Decode(reader)
if err != nil {
return nil, err
}
bounds := img.Bounds()
index := 0
for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
for x := bounds.Min.X; x < bounds.Max.X; x++ {
c := img.At(x, y)
r, g, b, a := c.RGBA()
//fmt.Println("x ", x, " y ", y, " Index: ", index, " Color ", c)
palette.colors[index] = &color.RGBA{uint8(r), uint8(g), uint8(b), uint8(a)}
index++
}
}
return palette, nil
}
func (m *Palette) GetColor(param2 int) *color.RGBA {
return m.colors[param2]
}

View File

@ -1,30 +0,0 @@
package colormapping
import (
"fmt"
"io/ioutil"
"testing"
)
func TestNewPalette(t *testing.T) {
data, err := ioutil.ReadFile("./testdata/unifieddyes_palette_extended.png")
if err != nil {
t.Fatal(err)
}
palette, err := NewPalette(data)
if err != nil {
t.Fatal(err)
}
color := palette.GetColor(0)
if color == nil {
t.Fatal("color not found!")
}
fmt.Println(color)
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 290 B

View File

@ -1,6 +1,8 @@
package coords package coords
//https://bitbucket.org/s_l_teichmann/mtsatellite/src/e1bf980a2b278c570b3f44f9452c9c087558acb3/common/coords.go?at=default&fileviewer=file-view-default import "mapserver/types"
// https://bitbucket.org/s_l_teichmann/mtsatellite/src/e1bf980a2b278c570b3f44f9452c9c087558acb3/common/coords.go?at=default&fileviewer=file-view-default
const ( const (
numBitsPerComponent = 12 numBitsPerComponent = 12
modulo = 1 << numBitsPerComponent modulo = 1 << numBitsPerComponent
@ -11,7 +13,7 @@ const (
MinPlainCoord = -34351347711 MinPlainCoord = -34351347711
) )
func CoordToPlain(c *MapBlockCoords) int64 { func CoordToPlain(c *types.MapBlockCoords) int64 {
return int64(c.Z)<<(2*numBitsPerComponent) + return int64(c.Z)<<(2*numBitsPerComponent) +
int64(c.Y)<<numBitsPerComponent + int64(c.Y)<<numBitsPerComponent +
int64(c.X) int64(c.X)
@ -33,8 +35,8 @@ func pythonModulo(i int16) int16 {
return modulo - -i&mask return modulo - -i&mask
} }
func PlainToCoord(i int64) *MapBlockCoords { func PlainToCoord(i int64) *types.MapBlockCoords {
c := MapBlockCoords{} c := types.MapBlockCoords{}
c.X = unsignedToSigned(pythonModulo(int16(i))) c.X = unsignedToSigned(pythonModulo(int16(i)))
i = (i - int64(c.X)) >> numBitsPerComponent i = (i - int64(c.X)) >> numBitsPerComponent
c.Y = unsignedToSigned(pythonModulo(int16(i))) c.Y = unsignedToSigned(pythonModulo(int16(i)))

View File

@ -1,6 +1,7 @@
package coords package coords
import ( import (
"mapserver/types"
"testing" "testing"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
@ -13,7 +14,7 @@ func init() {
} }
func TestMinCoord(t *testing.T) { func TestMinCoord(t *testing.T) {
c := NewMapBlockCoords(MinCoord, MinCoord, MinCoord) c := types.NewMapBlockCoords(types.MinCoord, types.MinCoord, types.MinCoord)
pc := CoordToPlain(c) pc := CoordToPlain(c)
log.WithFields(logrus.Fields{"coords": c, "plain": pc, "plain-1": pc - 1}).Info("TestMinCoord") log.WithFields(logrus.Fields{"coords": c, "plain": pc, "plain-1": pc - 1}).Info("TestMinCoord")
@ -22,7 +23,7 @@ func TestMinCoord(t *testing.T) {
} }
} }
func testCoordConvert(t *testing.T, mb *MapBlockCoords) { func testCoordConvert(t *testing.T, mb *types.MapBlockCoords) {
log.WithFields(logrus.Fields{"coords": mb}).Info("MapblockCoords") log.WithFields(logrus.Fields{"coords": mb}).Info("MapblockCoords")
p := CoordToPlain(mb) p := CoordToPlain(mb)
@ -45,6 +46,6 @@ func testCoordConvert(t *testing.T, mb *MapBlockCoords) {
} }
func TestZeorCoord(t *testing.T) { func TestZeroCoord(t *testing.T) {
testCoordConvert(t, NewMapBlockCoords(0, 0, 0)) testCoordConvert(t, types.NewMapBlockCoords(0, 0, 0))
} }

View File

@ -1,23 +1,24 @@
package coords package coords
import ( import (
"mapserver/types"
"testing" "testing"
) )
func TestNewMapBlockCoordsFromBlock(t *testing.T) { func TestNewMapBlockCoordsFromBlock(t *testing.T) {
c := NewMapBlockCoordsFromBlock(1, 1, 1) c := types.NewMapBlockCoordsFromBlock(1, 1, 1)
if c.X != 0 || c.Y != 0 || c.Z != 0 { if c.X != 0 || c.Y != 0 || c.Z != 0 {
t.Fatal("mismatch", c) t.Fatal("mismatch", c)
} }
c = NewMapBlockCoordsFromBlock(16, 1, 1) c = types.NewMapBlockCoordsFromBlock(16, 1, 1)
if c.X != 1 || c.Y != 0 || c.Z != 0 { if c.X != 1 || c.Y != 0 || c.Z != 0 {
t.Fatal("mismatch", c) t.Fatal("mismatch", c)
} }
c = NewMapBlockCoordsFromBlock(16, 1, -1) c = types.NewMapBlockCoordsFromBlock(16, 1, -1)
if c.X != 1 || c.Y != 0 || c.Z != -1 { if c.X != 1 || c.Y != 0 || c.Z != -1 {
t.Fatal("mismatch", c) t.Fatal("mismatch", c)

View File

@ -1,7 +1,7 @@
package coords package coords
import ( import (
"mapserver/layer" "mapserver/types"
"math" "math"
) )
@ -9,10 +9,10 @@ const (
MAX_ZOOM = 13 MAX_ZOOM = 13
) )
func GetTileCoordsFromMapBlock(mbc *MapBlockCoords, layers []*layer.Layer) *TileCoords { func GetTileCoordsFromMapBlock(mbc *types.MapBlockCoords, layers []*types.Layer) *TileCoords {
tc := TileCoords{X: mbc.X, Y: (mbc.Z + 1) * -1, Zoom: MAX_ZOOM} tc := TileCoords{X: mbc.X, Y: (mbc.Z + 1) * -1, Zoom: MAX_ZOOM}
currentLayer := layer.FindLayerByY(layers, mbc.Y) currentLayer := types.FindLayerByY(layers, mbc.Y)
if currentLayer == nil { if currentLayer == nil {
return nil return nil
@ -23,7 +23,7 @@ func GetTileCoordsFromMapBlock(mbc *MapBlockCoords, layers []*layer.Layer) *Tile
return &tc return &tc
} }
func GetMapBlockRangeFromTile(tc *TileCoords, y int) *MapBlockRange { func GetMapBlockRangeFromTile(tc *TileCoords, y int) *types.MapBlockRange {
scaleDiff := float64(MAX_ZOOM - tc.Zoom) scaleDiff := float64(MAX_ZOOM - tc.Zoom)
scale := int(math.Pow(2, scaleDiff)) scale := int(math.Pow(2, scaleDiff))
@ -33,8 +33,8 @@ func GetMapBlockRangeFromTile(tc *TileCoords, y int) *MapBlockRange {
mapBlockX2 := mapBlockX1 + scale - 1 mapBlockX2 := mapBlockX1 + scale - 1
mapBlockZ2 := (mapBlockZ1 + ((scale - 1) * -1)) mapBlockZ2 := (mapBlockZ1 + ((scale - 1) * -1))
return &MapBlockRange{ return &types.MapBlockRange{
Pos1: NewMapBlockCoords(mapBlockX1, y, mapBlockZ1), Pos1: types.NewMapBlockCoords(mapBlockX1, y, mapBlockZ1),
Pos2: NewMapBlockCoords(mapBlockX2, y, mapBlockZ2), Pos2: types.NewMapBlockCoords(mapBlockX2, y, mapBlockZ2),
} }
} }

View File

@ -1,15 +1,16 @@
package coords package coords
import ( import (
"github.com/stretchr/testify/assert" "mapserver/types"
"mapserver/layer"
"testing" "testing"
"github.com/stretchr/testify/assert"
) )
func TestConvertMapblockToTile1(t *testing.T) { func TestConvertMapblockToTile1(t *testing.T) {
mbc := NewMapBlockCoords(0, 0, 0) mbc := types.NewMapBlockCoords(0, 0, 0)
layers := []*layer.Layer{ layers := []*types.Layer{
&layer.Layer{ {
Id: 0, Id: 0,
Name: "Base", Name: "Base",
From: -16, From: -16,
@ -47,9 +48,9 @@ func TestGetMapBlockRangeFromTile(t *testing.T) {
} }
func TestConvertMapblockToTile2(t *testing.T) { func TestConvertMapblockToTile2(t *testing.T) {
mbc := NewMapBlockCoords(1, 0, 1) mbc := types.NewMapBlockCoords(1, 0, 1)
layers := []*layer.Layer{ layers := []*types.Layer{
&layer.Layer{ {
Id: 0, Id: 0,
Name: "Base", Name: "Base",
From: -16, From: -16,
@ -73,9 +74,9 @@ func TestConvertMapblockToTile2(t *testing.T) {
} }
func TestConvertMapblockToTile3(t *testing.T) { func TestConvertMapblockToTile3(t *testing.T) {
mbc := NewMapBlockCoords(-1, 0, -1) mbc := types.NewMapBlockCoords(-1, 0, -1)
layers := []*layer.Layer{ layers := []*types.Layer{
&layer.Layer{ {
Id: 0, Id: 0,
Name: "Base", Name: "Base",
From: -16, From: -16,

View File

@ -1,13 +1,12 @@
package db package db
import ( import (
"mapserver/coords"
"mapserver/layer"
"mapserver/settings" "mapserver/settings"
"mapserver/types"
) )
type Block struct { type Block struct {
Pos *coords.MapBlockCoords Pos *types.MapBlockCoords
Data []byte Data []byte
Mtime int64 Mtime int64
} }
@ -25,6 +24,6 @@ type DBAccessor interface {
GetTimestamp() (int64, error) GetTimestamp() (int64, error)
FindBlocksByMtime(gtmtime int64, limit int) ([]*Block, error) FindBlocksByMtime(gtmtime int64, limit int) ([]*Block, error)
FindNextInitialBlocks(s settings.Settings, layers []*layer.Layer, limit int) (*InitialBlocksResult, error) FindNextInitialBlocks(s settings.Settings, layers []*types.Layer, limit int) (*InitialBlocksResult, error)
GetBlock(pos *coords.MapBlockCoords) (*Block, error) GetBlock(pos *types.MapBlockCoords) (*Block, error)
} }

View File

@ -3,8 +3,8 @@ package postgres
import ( import (
"mapserver/coords" "mapserver/coords"
"mapserver/db" "mapserver/db"
"mapserver/layer"
"mapserver/settings" "mapserver/settings"
"mapserver/types"
"math" "math"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
@ -16,8 +16,8 @@ const (
SETTING_LAST_Y_BLOCK = "last_y_block" SETTING_LAST_Y_BLOCK = "last_y_block"
) )
func (this *PostgresAccessor) countBlocks(x1, y1, z1, x2, y2, z2 int) (int, error) { func (a *PostgresAccessor) countBlocks(x1, y1, z1, x2, y2, z2 int) (int, error) {
rows, err := this.db.Query(getBlockCountByInitialTileQuery, rows, err := a.db.Query(getBlockCountByInitialTileQuery,
x1, y1, z1, x2, y2, z2, x1, y1, z1, x2, y2, z2,
) )
@ -27,7 +27,7 @@ func (this *PostgresAccessor) countBlocks(x1, y1, z1, x2, y2, z2 int) (int, erro
defer rows.Close() defer rows.Close()
for rows.Next() { if rows.Next() {
var count int var count int
err = rows.Scan(&count) err = rows.Scan(&count)
@ -53,7 +53,7 @@ func (this *PostgresAccessor) countBlocks(x1, y1, z1, x2, y2, z2 int) (int, erro
//Zoom 9: //Zoom 9:
//10 mapblocks height * 16 * 16 == 2560 //10 mapblocks height * 16 * 16 == 2560
func (this *PostgresAccessor) FindNextInitialBlocks(s settings.Settings, layers []*layer.Layer, limit int) (*db.InitialBlocksResult, error) { func (a *PostgresAccessor) FindNextInitialBlocks(s settings.Settings, layers []*types.Layer, limit int) (*db.InitialBlocksResult, error) {
lastlayer := s.GetInt(SETTING_LAST_LAYER, 0) lastlayer := s.GetInt(SETTING_LAST_LAYER, 0)
lastxblock := s.GetInt(SETTING_LAST_X_BLOCK, -129) lastxblock := s.GetInt(SETTING_LAST_X_BLOCK, -129)
@ -88,7 +88,7 @@ func (this *PostgresAccessor) FindNextInitialBlocks(s settings.Settings, layers
} }
tc := coords.NewTileCoords(lastxblock, lastyblock, 9, lastlayer) tc := coords.NewTileCoords(lastxblock, lastyblock, 9, lastlayer)
currentlayer := layer.FindLayerById(layers, lastlayer) currentlayer := types.FindLayerById(layers, lastlayer)
tcr := coords.GetMapBlockRangeFromTile(tc, 0) tcr := coords.GetMapBlockRangeFromTile(tc, 0)
tcr.Pos1.Y = currentlayer.From tcr.Pos1.Y = currentlayer.From
@ -111,7 +111,7 @@ func (this *PostgresAccessor) FindNextInitialBlocks(s settings.Settings, layers
if lastxblock <= -128 { if lastxblock <= -128 {
//first x entry, check z stride //first x entry, check z stride
stridecount := this.intQuery(` stridecount := a.intQuery(`
select count(*) from blocks select count(*) from blocks
where posz >= $1 and posz <= $2 where posz >= $1 and posz <= $2
and posy >= $3 and posy <= $4`, and posy >= $3 and posy <= $4`,
@ -139,7 +139,7 @@ func (this *PostgresAccessor) FindNextInitialBlocks(s settings.Settings, layers
} }
} }
count, err := this.countBlocks(minX, minY, minZ, maxX, maxY, maxZ) count, err := a.countBlocks(minX, minY, minZ, maxX, maxY, maxZ)
if err != nil { if err != nil {
return nil, err return nil, err
@ -150,7 +150,7 @@ func (this *PostgresAccessor) FindNextInitialBlocks(s settings.Settings, layers
if count > 0 { if count > 0 {
rows, err := this.db.Query(getBlocksByInitialTileQuery, rows, err := a.db.Query(getBlocksByInitialTileQuery,
minX, minY, minZ, maxX, maxY, maxZ, minX, minY, minZ, maxX, maxY, maxZ,
) )

View File

@ -2,9 +2,9 @@ package postgres
import ( import (
"database/sql" "database/sql"
"mapserver/coords" "embed"
"mapserver/db" "mapserver/db"
"mapserver/public" "mapserver/types"
"time" "time"
_ "github.com/lib/pq" _ "github.com/lib/pq"
@ -15,6 +15,9 @@ type PostgresAccessor struct {
db *sql.DB db *sql.DB
} }
//go:embed migrations/*.sql
var migrations embed.FS
func (db *PostgresAccessor) Migrate() error { func (db *PostgresAccessor) Migrate() error {
hasMtime := true hasMtime := true
_, err := db.db.Query("select max(mtime) from blocks") _, err := db.db.Query("select max(mtime) from blocks")
@ -26,7 +29,7 @@ func (db *PostgresAccessor) Migrate() error {
log.Info("Migrating database, this might take a while depending on the mapblock-count") log.Info("Migrating database, this might take a while depending on the mapblock-count")
start := time.Now() start := time.Now()
sql, err := public.Files.ReadFile("sql/postgres_mapdb_migrate.sql") sql, err := migrations.ReadFile("migrations/postgres_mapdb_migrate.sql")
if err != nil { if err != nil {
return err return err
} }
@ -44,14 +47,14 @@ func (db *PostgresAccessor) Migrate() error {
} }
func convertRows(posx, posy, posz int, data []byte, mtime int64) *db.Block { func convertRows(posx, posy, posz int, data []byte, mtime int64) *db.Block {
c := coords.NewMapBlockCoords(posx, posy, posz) c := types.NewMapBlockCoords(posx, posy, posz)
return &db.Block{Pos: c, Data: data, Mtime: mtime} return &db.Block{Pos: c, Data: data, Mtime: mtime}
} }
func (this *PostgresAccessor) FindBlocksByMtime(gtmtime int64, limit int) ([]*db.Block, error) { func (a *PostgresAccessor) FindBlocksByMtime(gtmtime int64, limit int) ([]*db.Block, error) {
blocks := make([]*db.Block, 0) blocks := make([]*db.Block, 0)
rows, err := this.db.Query(getBlocksByMtimeQuery, gtmtime, limit) rows, err := a.db.Query(getBlocksByMtimeQuery, gtmtime, limit)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -75,8 +78,8 @@ func (this *PostgresAccessor) FindBlocksByMtime(gtmtime int64, limit int) ([]*db
return blocks, nil return blocks, nil
} }
func (this *PostgresAccessor) CountBlocks(frommtime, tomtime int64) (int, error) { func (a *PostgresAccessor) CountBlocks(frommtime, tomtime int64) (int, error) {
rows, err := this.db.Query(countBlocksQuery, frommtime, tomtime) rows, err := a.db.Query(countBlocksQuery, frommtime, tomtime)
if err != nil { if err != nil {
panic(err) panic(err)
} }
@ -97,8 +100,8 @@ func (this *PostgresAccessor) CountBlocks(frommtime, tomtime int64) (int, error)
return 0, nil return 0, nil
} }
func (db *PostgresAccessor) GetTimestamp() (int64, error) { func (a *PostgresAccessor) GetTimestamp() (int64, error) {
rows, err := db.db.Query(getTimestampQuery) rows, err := a.db.Query(getTimestampQuery)
if err != nil { if err != nil {
return 0, err return 0, err
} }
@ -119,8 +122,8 @@ func (db *PostgresAccessor) GetTimestamp() (int64, error) {
return 0, nil return 0, nil
} }
func (this *PostgresAccessor) GetBlock(pos *coords.MapBlockCoords) (*db.Block, error) { func (a *PostgresAccessor) GetBlock(pos *types.MapBlockCoords) (*db.Block, error) {
rows, err := this.db.Query(getBlockQuery, pos.X, pos.Y, pos.Z) rows, err := a.db.Query(getBlockQuery, pos.X, pos.Y, pos.Z)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -1,7 +1,7 @@
package postgres package postgres
func (this *PostgresAccessor) intQuery(q string, params ...interface{}) int { func (a *PostgresAccessor) intQuery(q string, params ...interface{}) int {
rows, err := this.db.Query(q, params...) rows, err := a.db.Query(q, params...)
if err != nil { if err != nil {
panic(err) panic(err)
} }

View File

@ -3,10 +3,8 @@ package sqlite
import ( import (
"mapserver/coords" "mapserver/coords"
"mapserver/db" "mapserver/db"
"mapserver/layer"
"mapserver/settings" "mapserver/settings"
"mapserver/types"
_ "modernc.org/sqlite"
) )
const ( const (
@ -23,7 +21,7 @@ order by b.pos asc, b.mtime asc
limit ? limit ?
` `
func (this *Sqlite3Accessor) FindNextInitialBlocks(s settings.Settings, layers []*layer.Layer, limit int) (*db.InitialBlocksResult, error) { func (a *Sqlite3Accessor) FindNextInitialBlocks(s settings.Settings, layers []*types.Layer, limit int) (*db.InitialBlocksResult, error) {
result := &db.InitialBlocksResult{} result := &db.InitialBlocksResult{}
blocks := make([]*db.Block, 0) blocks := make([]*db.Block, 0)
@ -33,7 +31,7 @@ func (this *Sqlite3Accessor) FindNextInitialBlocks(s settings.Settings, layers [
totallegacycount := s.GetInt64(SETTING_TOTAL_LEGACY_COUNT, -1) totallegacycount := s.GetInt64(SETTING_TOTAL_LEGACY_COUNT, -1)
if totallegacycount == -1 { if totallegacycount == -1 {
//Query from db //Query from db
totallegacycount, err := this.CountBlocks() totallegacycount, err := a.CountBlocks()
if err != nil { if err != nil {
panic(err) panic(err)
@ -42,7 +40,7 @@ func (this *Sqlite3Accessor) FindNextInitialBlocks(s settings.Settings, layers [
s.SetInt64(SETTING_TOTAL_LEGACY_COUNT, int64(totallegacycount)) s.SetInt64(SETTING_TOTAL_LEGACY_COUNT, int64(totallegacycount))
} }
rows, err := this.db.Query(getLastBlockQuery, lastpos, limit) rows, err := a.db.Query(getLastBlockQuery, lastpos, limit)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -72,7 +70,7 @@ func (this *Sqlite3Accessor) FindNextInitialBlocks(s settings.Settings, layers [
lastpos = pos lastpos = pos
blockcoordy := mb.Pos.Y blockcoordy := mb.Pos.Y
currentlayer := layer.FindLayerByY(layers, blockcoordy) currentlayer := types.FindLayerByY(layers, blockcoordy)
if currentlayer != nil { if currentlayer != nil {
blocks = append(blocks, mb) blocks = append(blocks, mb)

View File

@ -2,9 +2,11 @@ package sqlite
import ( import (
"database/sql" "database/sql"
"embed"
"errors"
"mapserver/coords" "mapserver/coords"
"mapserver/db" "mapserver/db"
"mapserver/public" "mapserver/types"
"time" "time"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
@ -21,6 +23,9 @@ type Sqlite3Accessor struct {
filename string filename string
} }
//go:embed migrations/*.sql
var migrations embed.FS
func (db *Sqlite3Accessor) Migrate() error { func (db *Sqlite3Accessor) Migrate() error {
//RW connection //RW connection
@ -43,7 +48,7 @@ func (db *Sqlite3Accessor) Migrate() error {
}).Info("Migrating database, this might take a while depending on the mapblock-count") }).Info("Migrating database, this might take a while depending on the mapblock-count")
start := time.Now() start := time.Now()
sql, err := public.Files.ReadFile("sql/sqlite_mapdb_migrate.sql") sql, err := migrations.ReadFile("migrations/sqlite_mapdb_migrate.sql")
if err != nil { if err != nil {
return err return err
} }
@ -136,7 +141,7 @@ func (db *Sqlite3Accessor) GetTimestamp() (int64, error) {
return 0, nil return 0, nil
} }
func (db *Sqlite3Accessor) GetBlock(pos *coords.MapBlockCoords) (*db.Block, error) { func (db *Sqlite3Accessor) GetBlock(pos *types.MapBlockCoords) (*db.Block, error) {
ppos := coords.CoordToPlain(pos) ppos := coords.CoordToPlain(pos)
rows, err := db.db.Query(getBlockQuery, ppos) rows, err := db.db.Query(getBlockQuery, ppos)
@ -164,7 +169,15 @@ func (db *Sqlite3Accessor) GetBlock(pos *coords.MapBlockCoords) (*db.Block, erro
} }
func New(filename string) (*Sqlite3Accessor, error) { func New(filename string) (*Sqlite3Accessor, error) {
db, err := sql.Open("sqlite", filename+"?mode=ro&_timeout=2000") db, err := sql.Open("sqlite", filename+"?mode=ro")
if err != nil {
return nil, err
}
// sqlite connection limit
db.SetMaxOpenConns(1)
err = EnableWAL(db)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -172,3 +185,21 @@ func New(filename string) (*Sqlite3Accessor, error) {
sq := &Sqlite3Accessor{db: db, filename: filename} sq := &Sqlite3Accessor{db: db, filename: filename}
return sq, nil return sq, nil
} }
func EnableWAL(db *sql.DB) error {
result := db.QueryRow("pragma journal_mode;")
var mode string
err := result.Scan(&mode)
if err != nil {
return err
}
if mode != "wal" {
_, err = db.Exec("pragma journal_mode = wal;")
if err != nil {
return errors.New("couldn't switch the db-journal to wal-mode, please stop the minetest-engine to allow doing this or do it manually: " + err.Error())
}
}
return nil
}

View File

@ -2,8 +2,8 @@ package sqlite
import ( import (
"io/ioutil" "io/ioutil"
"mapserver/coords"
"mapserver/testutils" "mapserver/testutils"
"mapserver/types"
"os" "os"
"testing" "testing"
@ -11,7 +11,7 @@ import (
) )
func TestMigrateEmpty(t *testing.T) { func TestMigrateEmpty(t *testing.T) {
tmpfile, err := ioutil.TempFile("", "TestMigrateEmpty.*.sqlite") tmpfile, err := os.CreateTemp("", "TestMigrateEmpty.*.sqlite")
if err != nil { if err != nil {
panic(err) panic(err)
} }
@ -64,7 +64,7 @@ func TestMigrateAndQuery(t *testing.T) {
panic(err) panic(err)
} }
block, err := a.GetBlock(coords.NewMapBlockCoords(0, 0, 0)) block, err := a.GetBlock(types.NewMapBlockCoords(0, 0, 0))
if err != nil { if err != nil {
panic(err) panic(err)

View File

@ -59,16 +59,26 @@
"trainsignal": true, "trainsignal": true,
"minecart": false, "minecart": false,
"locator": false, "locator": false,
"signs": true "signs": true,
"mapserver_airutils": true,
"phonograph": true,
"um_area_forsale": true
}, },
"mapblockaccessor": { "mapblockaccessor": {
"expiretime": "15s", "expiretime": "15s",
"purgetime": "30s", "purgetime": "30s",
"maxitems": 500 "maxitems": 0
}, },
"defaultoverlays": [ "defaultoverlays": [
"mapserver_poi", "mapserver_poi",
"mapserver_label", "mapserver_label",
"mapserver_player" "mapserver_player"
] ],
"skins": {
"enableskinsdb": false,
"skinspath": ""
},
"worldpath": "./",
"datapath": "./",
"colorstxtpath": "./"
} }

17
dev/world.postgres.mt Normal file
View File

@ -0,0 +1,17 @@
gameid = minetest
creative_mode = true
enable_damage = true
auth_backend = postgresql
pgsql_auth_connection = host=postgres user=postgres password=enter dbname=postgres
player_backend = postgresql
pgsql_player_connection = host=postgres port=5432 user=postgres password=enter dbname=postgres
backend = postgresql
pgsql_connection = host=postgres port=5432 user=postgres password=enter dbname=postgres
mod_storage_backend = postgresql
pgsql_mod_storage_connection = host=postgres user=postgres password=enter dbname=postgres
pgsql_mapserver_connection = host=postgres port=5432 user=postgres password=enter dbname=postgres

@ -1 +1 @@
Subproject commit ad4e151184bc4abb3087b8fd45377accc88c0114 Subproject commit 1ab5ddd6ba9ac205814f8cc2bb181a212d74ab82

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

View File

@ -1 +0,0 @@
<mxfile modified="2019-02-07T21:27:44.686Z" host="www.draw.io" agent="Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:65.0) Gecko/20100101 Firefox/65.0" etag="tnhgfPkYZ02dah6ygGXB" version="10.1.9" type="device"><diagram name="Page-1" id="5f0bae14-7c28-e335-631c-24af17079c00">7Vpbc9soFP41ntl9SEcXS3Eec2na6bRJZ5Nu2qcdLGGZBgkv4Njur1+QQEICOZc6irMTPyTigED6zne+c8Aehaf5+gMFi/kXkkI8Crx0PQrPRkHgj4NY/JOWTWU5PIwqQ0ZRqgY1hiv0Cyqjp6xLlELWGsgJwRwt2saEFAVMeMsGKCWr9rAZwe1VFyCDluEqAdi23qCUz5XV97ym4yNE2VwtPYlUxxQktxkly0KtNwrCWfmpunOg51Lj2RykZGWYwvej8JQSwqurfH0KscRWw1bdd97TWz83hQV/yA3hkR95cDKezPxoMvaSA+WnO4CXCosvYMEgvYNUPTHfaJTEwy/kZULyBSnKFU8ARlkhbBjOZJMtQIKK7HPZOgtjYSrRgXJ9Tw7QAMiGmAgl6hqDKcQnNZynBBMqugqxkLyNU3ILtVGg7JWfukd7zReWGcLYGKn8Ieyk4OcgR1iS9G9IU1AAZVaM9APVdi005zlWK9ioK0cI1DhcGyblhQ+Q5JDTjRiieoOJYsSm0141/Btrls0N6sXKBhTls3rqxu3iQnnezQJ2sYnB9fdvny6P0OX8LvdvLvhBYDHh6l+MOOylQQo4YJxQ6Z/VXIy8Es6XHSshEi7ALHQcGPYC5kdtwOrYNACLh8QrdEWOMJwJWKaAOXBboRyDks4GNIwDqvkXlDwjFP0SHAR6RCIbqID0elPizimEO8I0aGMa2ZAGYwem/rOB6tt6lIPFO+Zmonhz3kXT1AklHqYgKJOWrUQgJZQuPJE4IpEQjlVHjtIU9zG7LWkPckQ/hXq9M+4QPnAohMM5wXP5ZtxD+MvpT5mTTeZ7f1wjLBK6fJYY5BKz6m+Zw/98BaERTqLdh4Za7S8BFygyDI3ljp62XNfZAAs6F4DDE0lRZvm8ftGn08CO0IHzRD85+715r84Nmjp8O5RyXXX9X7Vuu4P2TetiW+uEzHDI+CvQrjjat7R+aMNJ0l7BWFCSQMbul4tm93W55BgV8LdlJN4KbKdcGtu4+oOW7L5N01pH/skdCL92EdnunsN2DvX9FxaRieWdb2zLtnqZ4+OEExPcz3JT/JUwxBGRIE8J5yTv3y2b292ugzjpRA+pYua0PlN5sG/ukZ9Oth3Hth/CIcPkyPLDiTwycrli77S8WxiOHdvemsED7dHskwJR5WMpLCm6E5eZvPx0dXmhzWIZo8cxWHBwhjLdMaXdod0J9uNEosNz1xHOsGWlfSTRlJU/mVCQV5wP7vFFp4AMHTXPoNrv2yWPhT4s0mN5eC1hxIAxeRZq+gKuEf8uMXoXRKr5w+g6Wyv8ysZGNwrx+NVdh5Fu/zA7m/vK1qblBZhaJ+XWKScjS5rALS+v3l3IZga51jHXwbPtT8NfrlJK2yjEgKO79qNu2XJ/JajgBl38Nl3qlKWnqF5R3RUY5+ndieJOqT3pTFRhYE20q824b9cYH6+vv+5poFPCgapkDqJwR9VGJ/Lr0uKlIl9P/OjIL8uM7YLQxHYrtP1nCe2+74rMsH7MVv8ttB/HI/2d0jPwqE4sT8orwUvllfAtrwxFPleN/8TyxTc41jDOzbIdkkVvU97Y8vxssTceL53y3BLnDUW+o33nXui1KVP/1uCx3As7h831AcVQ3LO/S6kq4PMbOGUkuYWcWWTcj3J49PvVb9Td9zrO2nZU/Ypm8zulynvNj8HC9/8B</diagram></mxfile>

View File

@ -15,13 +15,13 @@ Ubuntu install: https://github.com/golang/go/wiki/Ubuntu
Generate the js bundle for the frontend: Generate the js bundle for the frontend:
``` ```
cd public/js cd public
rollup -c rollup.config.js rollup -c rollup.config.js
``` ```
Generate the `mapserver` binary: Generate the `mapserver` binary:
```bash ```bash
# build the binary for the current playtform # build the binary for the current platform
go build go build
# (optionally) run the unit-tests # (optionally) run the unit-tests

View File

@ -14,8 +14,6 @@ scifi_nodes:slope_vent 120 120 120
scifi_nodes:white2 240 240 240 scifi_nodes:white2 240 240 240
``` ```
Default colors, see: [colors.txt](../server/static/colors.txt)
## Configuration json ## Configuration json
All config options reside in the `mapserver.json` file with the default values All config options reside in the `mapserver.json` file with the default values
@ -63,7 +61,11 @@ The mapserver will generate a fresh `mapserver.json` if there is none at startup
"expiretime": "10s", "expiretime": "10s",
"purgetime": "15s", "purgetime": "15s",
"maxitems": 5000 "maxitems": 5000
} },
"skins": {
"enableskinsdb": true,
"skinspath": "/path/to/minetest/mods/skinsdb/textures"
}
} }
``` ```
@ -119,3 +121,11 @@ Enables the [Prometheus](./prometheus.md) metrics endpoint
#### mapblockaccessor.maxitems #### mapblockaccessor.maxitems
Number of mapblocks to keep in memory, dial this down if you have memory issues Number of mapblocks to keep in memory, dial this down if you have memory issues
#### skins.enableskinsdb
Enables support for serving/displaying custom player skins provided by the SkinsDB mod.
#### skins.skinspath
The path to where SkinsDB textures are stored. This should be the SkinsDB textures directory.
Example: `/path/to/minetest/mods/skinsdb/textures`

View File

@ -1,58 +1,37 @@
# System overview
<img src="./Overview.png">
# Build dependencies # Build dependencies
* go >= 1.16 * docker
* nodejs >= v17.4.0 * docker-compose
* npm >= 8.3.0
# Create the frontend bundle # Create the frontend bundle
```bash ```bash
cd public docker-compose up mapserver_frontend
npm ci
npm run bundle
``` ```
# Development setup # Development setup (sqlite)
Working directory: `./server` ```bash
# start the engine in the first window/shell
## Preparing the files and map docker-compose up minetest
# and the mapserver in another
Copy your `map.sqlite` into the working directory if you want to test with docker-compose up mapserver
a sqlite map database
### world.mt
You need a `world.mt` too in order to make the connection to the database.
In the sqlite case:
```
gameid = minetest
backend = sqlite3
creative_mode = false
enable_damage = false
player_backend = files
``` ```
For postgres: # Development setup (postgres)
```
gameid = minetest ```bash
backend = postgresql # start postgres in the background
creative_mode = true docker-compose -f docker-compose.yml -f docker-compose.postgres.yml up -d postgres
enable_damage = true # start the engine in the first window/shell
player_backend = postgresql docker-compose -f docker-compose.yml -f docker-compose.postgres.yml up minetest
pgsql_connection = host=localhost port=5432 user=postgres password=enter dbname=postgres # and the mapserver in another
pgsql_player_connection = host=localhost port=5432 user=postgres password=enter dbname=postgres docker-compose -f docker-compose.yml -f docker-compose.postgres.yml up mapserver
``` ```
## Running the server Utilities:
```sh
* Create a `mapserver.json` with `go run . -createconfig` # psql
* Change the value `webdev` in the `mapserver.json` to `true` docker-compose -f docker-compose.yml -f docker-compose.postgres.yml exec postgres psql -U postgres
* Start the server with `go run .` or with debug output: `go run . -debug` ```
* The web files in `public/` can now be changed on the fly without restarting the server

View File

@ -14,12 +14,10 @@ For additional infos (lag,time,players => active mode) on the mapserver interfac
## Docker image ## Docker image
* Docker-hub: https://hub.docker.com/repository/docker/minetestmapserver/mapserver
Simple docker run example to run in the world-directory: Simple docker run example to run in the world-directory:
``` ```
docker run --rm --it -p 8080:8080 -v $(pwd):/minetest -w /minetest minetestmapserver/mapserver docker run --rm --it -p 8080:8080 -v $(pwd):/minetest -w /minetest ghcr.io/minetest-mapserver/mapserver
``` ```
## Docker compose ## Docker compose
@ -29,7 +27,7 @@ Examplary `docker-compose` config:
```yml ```yml
services: services:
mapserver: mapserver:
image: minetesttools/mapserver image: ghcr.io/minetest-mapserver/mapserver
restart: always restart: always
networks: networks:
- default - default

View File

@ -72,3 +72,11 @@
* unifieddyes_palette_extended.png * unifieddyes_palette_extended.png
* GPL 2.0 * GPL 2.0
* Source: https://gitlab.com/VanessaE/unifieddyes * Source: https://gitlab.com/VanessaE/unifieddyes
* phonograph_node_temp.png
* License: CC By-SA 4.0
* Source: [phonograph](https://github.com/C-C-Minetest-Server/phonograph/)
* um_area_forsale_sign_alpha.png
* By Gabriel Pérez-Cerezo; AGPL 3.0
* Modified from https://github.com/C-C-Minetest-Server/um_area_forsale/blob/main/textures/um_area_forsale_sign.png

View File

@ -8,6 +8,7 @@ you get more realtime-data from within your minetest-world:
* Current players with their positions * Current players with their positions
* Current time and max lag * Current time and max lag
* Planes using the [Airutils library](https://github.com/APercy/airutils) by APercy, if installed
You can use the `mapserver-mod` either passive or active: You can use the `mapserver-mod` either passive or active:
* *Passive* Makes some additional markers available (POI, Labels, etc) * *Passive* Makes some additional markers available (POI, Labels, etc)

View File

@ -11,7 +11,7 @@ but it will be in the region of several gigabytes (5 to 10 GB for "older" server
## Memory ## Memory
Memory depedends on the amount of caching (see: [Configuration](./config.md)) Memory depends on the amount of caching (see: [Configuration](./config.md))
Per default there will be around 500 mapblocks cached for quicker access. Per default there will be around 500 mapblocks cached for quicker access.
This will be around 5 to 10 megabytes depending on the contents. This will be around 5 to 10 megabytes depending on the contents.

View File

@ -1,11 +0,0 @@
# Stats webfragment
<img src="./pics/stats_webfragment.png"></img>
The "world stats" info from the bottom right corner of the mapserver
can be embedded as an iframe into any existing web-page:
```html
<iframe src="http://127.0.0.1:8080/stats.html"></iframe>
```

View File

@ -0,0 +1,21 @@
version: "3.6"
services:
postgres:
image: postgres:16.3
restart: always
environment:
POSTGRES_PASSWORD: enter
volumes:
- "pg_data:/var/lib/postgresql/data"
mapserver:
volumes:
- "./dev/world.postgres.mt:/data/world/world.mt"
minetest:
volumes:
- "./dev/world.postgres.mt:/root/.minetest/worlds/world/world.mt"
volumes:
pg_data: {}

View File

@ -2,21 +2,23 @@ version: "3.6"
services: services:
mapserver_frontend: mapserver_frontend:
image: node:alpine3.13 image: node:21.7.3-alpine
volumes: volumes:
- "dev_home:/root" - "dev_home:/root"
- ".:/data" - ".:/data"
working_dir: /data/public working_dir: /data/public
command: ["npm", "i"] command: ["npm", "ci"]
mapserver: mapserver:
image: golang:1.17.6 image: golang:1.22.4
depends_on: depends_on:
- minetest - minetest
- mapserver_frontend - mapserver_frontend
volumes: volumes:
- "dev_home:/root" - "dev_home:/root"
- "world_data:/data/world" - "world_data:/data/world"
- "go_dir:/go"
- "go_cache:/.cache"
- ".:/data" - ".:/data"
- "./public:/data/world/public" - "./public:/data/world/public"
- "./dev/mapserver.json:/data/world/mapserver.json" - "./dev/mapserver.json:/data/world/mapserver.json"
@ -26,7 +28,7 @@ services:
command: ["go", "run", ".."] command: ["go", "run", ".."]
minetest: minetest:
image: registry.gitlab.com/minetest/minetest/server:5.5.0 image: registry.gitlab.com/minetest/minetest/server:5.7.0
user: root user: root
volumes: volumes:
- "world_data:/root/.minetest/worlds/world" - "world_data:/root/.minetest/worlds/world"
@ -38,4 +40,6 @@ services:
volumes: volumes:
world_data: {} world_data: {}
dev_home: {} dev_home: {}
go_dir: {}
go_cache: {}

55
go.mod
View File

@ -1,15 +1,52 @@
module mapserver module mapserver
require ( require (
github.com/gorilla/websocket v1.4.2 github.com/golang-migrate/migrate/v4 v4.17.1
github.com/lib/pq v1.10.2 github.com/google/uuid v1.6.0
github.com/minetest-go/mapparser v0.1.1 github.com/gorilla/websocket v1.5.3
github.com/lib/pq v1.10.9
github.com/minetest-go/areasparser v1.0.5
github.com/minetest-go/colormapping v1.0.5
github.com/minetest-go/mapparser v0.1.9
github.com/patrickmn/go-cache v2.1.0+incompatible github.com/patrickmn/go-cache v2.1.0+incompatible
github.com/prometheus/client_golang v1.12.1 github.com/prometheus/client_golang v1.19.1
github.com/sirupsen/logrus v1.8.1 github.com/sirupsen/logrus v1.9.3
github.com/stretchr/testify v1.7.0 github.com/stretchr/testify v1.9.0
github.com/yuin/gopher-lua v0.0.0-20210529063254-f4c35e4016d9 github.com/yuin/gopher-lua v1.1.1
modernc.org/sqlite v1.14.5 modernc.org/sqlite v1.30.1
) )
go 1.16 require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/klauspost/compress v1.16.0 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-sqlite3 v1.14.16 // indirect
github.com/ncruces/go-strftime v0.1.9 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/prometheus/client_model v0.5.0 // indirect
github.com/prometheus/common v0.48.0 // indirect
github.com/prometheus/procfs v0.12.0 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
go.uber.org/atomic v1.7.0 // indirect
golang.org/x/net v0.23.0 // indirect
golang.org/x/sys v0.19.0 // indirect
google.golang.org/protobuf v1.33.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect
modernc.org/libc v1.52.1 // indirect
modernc.org/mathutil v1.6.0 // indirect
modernc.org/memory v1.8.0 // indirect
modernc.org/strutil v1.2.0 // indirect
modernc.org/token v1.1.0 // indirect
)
go 1.22
toolchain go1.22.4

760
go.sum
View File

@ -1,646 +1,144 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dhui/dktest v0.4.1 h1:/w+IWuDXVymg3IrRJCHHOkMK10m9aNVMOyD0X12YVTg=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dhui/dktest v0.4.1/go.mod h1:DdOqcUpL7vgyP4GlF3X3w7HbSlz8cEQzwewPveYEQbA=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/docker/docker v24.0.9+incompatible h1:HPGzNmwfLZWdxHqK9/II92pyi1EpYKsAqcl4G0Of9v0=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/docker/docker v24.0.9+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/golang-migrate/migrate/v4 v4.17.1 h1:4zQ6iqL6t6AiItphxJctQb3cFqWiSpMnX7wLTPnnYO4=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/golang-migrate/migrate/v4 v4.17.1/go.mod h1:m8hinFyWBn0SA4QKHuKh175Pm9wjmxj3S2Mia7dbXzM=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4=
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y=
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/minetest-go/areasparser v1.0.5 h1:kyfb7mk4S7Gvx5N42uJK8ze3BAbfj8uyLsv2Tuy43MQ=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/minetest-go/areasparser v1.0.5/go.mod h1:NvohBk60WBrAbfvgmJccCEblz9I/Ygba4k9V81rwoNc=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/minetest-go/colormapping v1.0.5 h1:axZm0xbOz0RQEIFvZmbxr3kuvebYiG0AAADPr8/ZQfg=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/minetest-go/colormapping v1.0.5/go.mod h1:6UVusIQTqfWbcru5HTktWwB2BCNHUE3W0VkkRBaMfcw=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/minetest-go/mapparser v0.1.9 h1:mGjRwA2twJRyzSrYuJWvyNpEkO469K/Qun327v8rhwE=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/minetest-go/mapparser v0.1.9/go.mod h1:zE+JdqiicINR+kzZ4gS6BBh+vLVPQSwkYiEkG0A1Cys=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.14.2 h1:S0OHlFk/Gbon/yauFJ4FfJJF5V0fc5HbBTJazi28pRw=
github.com/klauspost/compress v1.14.2/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8=
github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-sqlite3 v1.14.10 h1:MLn+5bFRlWMGoSRmJour3CL1w/qL96mvipqpwQW/Sfk=
github.com/mattn/go-sqlite3 v1.14.10/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/minetest-go/mapparser v0.1.1 h1:Ir7ChKX0lwnyr6Zg/Jd3ipQT1vPCAQYN6GWmQXK020Y=
github.com/minetest-go/mapparser v0.1.1/go.mod h1:Rjv12WQ3Tn9BsOr0ohFguGWFol3vIfgQcTUy5wCACgo=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE=
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho=
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=
github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=
github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=
github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=
github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ=
github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=
github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4=
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
github.com/yuin/gopher-lua v0.0.0-20210529063254-f4c35e4016d9 h1:k/gmLsJDWwWqbLCur2yWnJzwQEKRcAHXo6seXGuSwWw= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
github.com/yuin/gopher-lua v0.0.0-20210529063254-f4c35e4016d9/go.mod h1:E1AXubJBdNmFERAOucpDIxNzeGfLzg0mYh+UfMWdChA= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210902050250-f475640dd07b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac h1:oN6lz7iLW/YC7un8pq+9bOLyXrprv2+DKfkJY+2LJJw=
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0=
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78 h1:M8tBwCtWD/cZV9DZpFYRUgaymAYAr+aIUTWzDaM3uPs=
golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1 h1:7QnIQpGRHE5RnLKnESfDoxm2dTapTZua5a0kS0A+VXQ=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= modernc.org/cc/v4 v4.21.2 h1:dycHFB/jDc3IyacKipCNSDrjIC0Lm1hyoWOZTRR20Lk=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= modernc.org/cc/v4 v4.21.2/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= modernc.org/ccgo/v4 v4.17.10 h1:6wrtRozgrhCxieCeJh85QsxkX/2FFrT9hdaWPlbn4Zo=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= modernc.org/ccgo/v4 v4.17.10/go.mod h1:0NBHgsqTTpm9cA5z2ccErvGZmtntSM9qD2kFAs6pjXM=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=
lukechampine.com/uint128 v1.1.1 h1:pnxCASz787iMf+02ssImqk6OLt+Z5QHMoZyUXR4z6JU= modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=
lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw=
modernc.org/cc/v3 v3.33.6/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU=
modernc.org/cc/v3 v3.33.9/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI=
modernc.org/cc/v3 v3.33.11/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4=
modernc.org/cc/v3 v3.34.0/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= modernc.org/libc v1.52.1 h1:uau0VoiT5hnR+SpoWekCKbLqm7v6dhRL3hI+NQhgN3M=
modernc.org/cc/v3 v3.35.0/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= modernc.org/libc v1.52.1/go.mod h1:HR4nVzFDSDizP620zcMCgjb1/8xk2lg5p/8yjfGv1IQ=
modernc.org/cc/v3 v3.35.4/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4=
modernc.org/cc/v3 v3.35.5/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo=
modernc.org/cc/v3 v3.35.7/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E=
modernc.org/cc/v3 v3.35.8/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU=
modernc.org/cc/v3 v3.35.10/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4=
modernc.org/cc/v3 v3.35.15/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
modernc.org/cc/v3 v3.35.16/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc=
modernc.org/cc/v3 v3.35.17/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss=
modernc.org/cc/v3 v3.35.18/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= modernc.org/sqlite v1.30.1 h1:YFhPVfu2iIgUf9kuA1CR7iiHdcEEsI2i+yjRYHscyxk=
modernc.org/cc/v3 v3.35.20/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= modernc.org/sqlite v1.30.1/go.mod h1:DUmsiWQDaAvU4abhc/N+djlom/L2o8f7gZ95RCvyoLU=
modernc.org/cc/v3 v3.35.22 h1:BzShpwCAP7TWzFppM4k2t03RhXhgYqaibROWkrWq7lE= modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=
modernc.org/cc/v3 v3.35.22/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0=
modernc.org/ccgo/v3 v3.9.5/go.mod h1:umuo2EP2oDSBnD3ckjaVUXMrmeAw8C8OSICVa0iFf60= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
modernc.org/ccgo/v3 v3.10.0/go.mod h1:c0yBmkRFi7uW4J7fwx/JiijwOjeAeR2NoSaRVFPmjMw= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
modernc.org/ccgo/v3 v3.11.0/go.mod h1:dGNposbDp9TOZ/1KBxghxtUp/bzErD0/0QW4hhSaBMI=
modernc.org/ccgo/v3 v3.11.1/go.mod h1:lWHxfsn13L3f7hgGsGlU28D9eUOf6y3ZYHKoPaKU0ag=
modernc.org/ccgo/v3 v3.11.3/go.mod h1:0oHunRBMBiXOKdaglfMlRPBALQqsfrCKXgw9okQ3GEw=
modernc.org/ccgo/v3 v3.12.4/go.mod h1:Bk+m6m2tsooJchP/Yk5ji56cClmN6R1cqc9o/YtbgBQ=
modernc.org/ccgo/v3 v3.12.6/go.mod h1:0Ji3ruvpFPpz+yu+1m0wk68pdr/LENABhTrDkMDWH6c=
modernc.org/ccgo/v3 v3.12.8/go.mod h1:Hq9keM4ZfjCDuDXxaHptpv9N24JhgBZmUG5q60iLgUo=
modernc.org/ccgo/v3 v3.12.11/go.mod h1:0jVcmyDwDKDGWbcrzQ+xwJjbhZruHtouiBEvDfoIsdg=
modernc.org/ccgo/v3 v3.12.14/go.mod h1:GhTu1k0YCpJSuWwtRAEHAol5W7g1/RRfS4/9hc9vF5I=
modernc.org/ccgo/v3 v3.12.18/go.mod h1:jvg/xVdWWmZACSgOiAhpWpwHWylbJaSzayCqNOJKIhs=
modernc.org/ccgo/v3 v3.12.20/go.mod h1:aKEdssiu7gVgSy/jjMastnv/q6wWGRbszbheXgWRHc8=
modernc.org/ccgo/v3 v3.12.21/go.mod h1:ydgg2tEprnyMn159ZO/N4pLBqpL7NOkJ88GT5zNU2dE=
modernc.org/ccgo/v3 v3.12.22/go.mod h1:nyDVFMmMWhMsgQw+5JH6B6o4MnZ+UQNw1pp52XYFPRk=
modernc.org/ccgo/v3 v3.12.25/go.mod h1:UaLyWI26TwyIT4+ZFNjkyTbsPsY3plAEB6E7L/vZV3w=
modernc.org/ccgo/v3 v3.12.29/go.mod h1:FXVjG7YLf9FetsS2OOYcwNhcdOLGt8S9bQ48+OP75cE=
modernc.org/ccgo/v3 v3.12.36/go.mod h1:uP3/Fiezp/Ga8onfvMLpREq+KUjUmYMxXPO8tETHtA8=
modernc.org/ccgo/v3 v3.12.38/go.mod h1:93O0G7baRST1vNj4wnZ49b1kLxt0xCW5Hsa2qRaZPqc=
modernc.org/ccgo/v3 v3.12.43/go.mod h1:k+DqGXd3o7W+inNujK15S5ZYuPoWYLpF5PYougCmthU=
modernc.org/ccgo/v3 v3.12.46/go.mod h1:UZe6EvMSqOxaJ4sznY7b23/k13R8XNlyWsO5bAmSgOE=
modernc.org/ccgo/v3 v3.12.47/go.mod h1:m8d6p0zNps187fhBwzY/ii6gxfjob1VxWb919Nk1HUk=
modernc.org/ccgo/v3 v3.12.50/go.mod h1:bu9YIwtg+HXQxBhsRDE+cJjQRuINuT9PUK4orOco/JI=
modernc.org/ccgo/v3 v3.12.51/go.mod h1:gaIIlx4YpmGO2bLye04/yeblmvWEmE4BBBls4aJXFiE=
modernc.org/ccgo/v3 v3.12.53/go.mod h1:8xWGGTFkdFEWBEsUmi+DBjwu/WLy3SSOrqEmKUjMeEg=
modernc.org/ccgo/v3 v3.12.54/go.mod h1:yANKFTm9llTFVX1FqNKHE0aMcQb1fuPJx6p8AcUx+74=
modernc.org/ccgo/v3 v3.12.55/go.mod h1:rsXiIyJi9psOwiBkplOaHye5L4MOOaCjHg1Fxkj7IeU=
modernc.org/ccgo/v3 v3.12.56/go.mod h1:ljeFks3faDseCkr60JMpeDb2GSO3TKAmrzm7q9YOcMU=
modernc.org/ccgo/v3 v3.12.57/go.mod h1:hNSF4DNVgBl8wYHpMvPqQWDQx8luqxDnNGCMM4NFNMc=
modernc.org/ccgo/v3 v3.12.60/go.mod h1:k/Nn0zdO1xHVWjPYVshDeWKqbRWIfif5dtsIOCUVMqM=
modernc.org/ccgo/v3 v3.12.66/go.mod h1:jUuxlCFZTUZLMV08s7B1ekHX5+LIAurKTTaugUr/EhQ=
modernc.org/ccgo/v3 v3.12.67/go.mod h1:Bll3KwKvGROizP2Xj17GEGOTrlvB1XcVaBrC90ORO84=
modernc.org/ccgo/v3 v3.12.73/go.mod h1:hngkB+nUUqzOf3iqsM48Gf1FZhY599qzVg1iX+BT3cQ=
modernc.org/ccgo/v3 v3.12.81/go.mod h1:p2A1duHoBBg1mFtYvnhAnQyI6vL0uw5PGYLSIgF6rYY=
modernc.org/ccgo/v3 v3.12.84/go.mod h1:ApbflUfa5BKadjHynCficldU1ghjen84tuM5jRynB7w=
modernc.org/ccgo/v3 v3.12.86/go.mod h1:dN7S26DLTgVSni1PVA3KxxHTcykyDurf3OgUzNqTSrU=
modernc.org/ccgo/v3 v3.12.90/go.mod h1:obhSc3CdivCRpYZmrvO88TXlW0NvoSVvdh/ccRjJYko=
modernc.org/ccgo/v3 v3.12.92/go.mod h1:5yDdN7ti9KWPi5bRVWPl8UNhpEAtCjuEE7ayQnzzqHA=
modernc.org/ccgo/v3 v3.13.1/go.mod h1:aBYVOUfIlcSnrsRVU8VRS35y2DIfpgkmVkYZ0tpIXi4=
modernc.org/ccgo/v3 v3.14.0/go.mod h1:hBrkiBlUwvr5vV/ZH9YzXIp982jKE8Ek8tR1ytoAL6Q=
modernc.org/ccgo/v3 v3.15.1 h1:bagyhO7uFlYWedkh6mfIYf8LZGYnVGPYh2FqXisaOV4=
modernc.org/ccgo/v3 v3.15.1/go.mod h1:md59wBwDT2LznX/OTCPoVS6KIsdRgY8xqQwBV+hkTH0=
modernc.org/ccorpus v1.11.1 h1:K0qPfpVG1MJh5BYazccnmhywH4zHuOgJXgbjzyp6dWA=
modernc.org/ccorpus v1.11.1/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ=
modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM=
modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM=
modernc.org/libc v1.9.8/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w=
modernc.org/libc v1.9.11/go.mod h1:NyF3tsA5ArIjJ83XB0JlqhjTabTCHm9aX4XMPHyQn0Q=
modernc.org/libc v1.11.0/go.mod h1:2lOfPmj7cz+g1MrPNmX65QCzVxgNq2C5o0jdLY2gAYg=
modernc.org/libc v1.11.2/go.mod h1:ioIyrl3ETkugDO3SGZ+6EOKvlP3zSOycUETe4XM4n8M=
modernc.org/libc v1.11.5/go.mod h1:k3HDCP95A6U111Q5TmG3nAyUcp3kR5YFZTeDS9v8vSU=
modernc.org/libc v1.11.6/go.mod h1:ddqmzR6p5i4jIGK1d/EiSw97LBcE3dK24QEwCFvgNgE=
modernc.org/libc v1.11.11/go.mod h1:lXEp9QOOk4qAYOtL3BmMve99S5Owz7Qyowzvg6LiZso=
modernc.org/libc v1.11.13/go.mod h1:ZYawJWlXIzXy2Pzghaf7YfM8OKacP3eZQI81PDLFdY8=
modernc.org/libc v1.11.16/go.mod h1:+DJquzYi+DMRUtWI1YNxrlQO6TcA5+dRRiq8HWBWRC8=
modernc.org/libc v1.11.19/go.mod h1:e0dgEame6mkydy19KKaVPBeEnyJB4LGNb0bBH1EtQ3I=
modernc.org/libc v1.11.24/go.mod h1:FOSzE0UwookyT1TtCJrRkvsOrX2k38HoInhw+cSCUGk=
modernc.org/libc v1.11.26/go.mod h1:SFjnYi9OSd2W7f4ct622o/PAYqk7KHv6GS8NZULIjKY=
modernc.org/libc v1.11.27/go.mod h1:zmWm6kcFXt/jpzeCgfvUNswM0qke8qVwxqZrnddlDiE=
modernc.org/libc v1.11.28/go.mod h1:Ii4V0fTFcbq3qrv3CNn+OGHAvzqMBvC7dBNyC4vHZlg=
modernc.org/libc v1.11.31/go.mod h1:FpBncUkEAtopRNJj8aRo29qUiyx5AvAlAxzlx9GNaVM=
modernc.org/libc v1.11.34/go.mod h1:+Tzc4hnb1iaX/SKAutJmfzES6awxfU1BPvrrJO0pYLg=
modernc.org/libc v1.11.37/go.mod h1:dCQebOwoO1046yTrfUE5nX1f3YpGZQKNcITUYWlrAWo=
modernc.org/libc v1.11.39/go.mod h1:mV8lJMo2S5A31uD0k1cMu7vrJbSA3J3waQJxpV4iqx8=
modernc.org/libc v1.11.42/go.mod h1:yzrLDU+sSjLE+D4bIhS7q1L5UwXDOw99PLSX0BlZvSQ=
modernc.org/libc v1.11.44/go.mod h1:KFq33jsma7F5WXiYelU8quMJasCCTnHK0mkri4yPHgA=
modernc.org/libc v1.11.45/go.mod h1:Y192orvfVQQYFzCNsn+Xt0Hxt4DiO4USpLNXBlXg/tM=
modernc.org/libc v1.11.47/go.mod h1:tPkE4PzCTW27E6AIKIR5IwHAQKCAtudEIeAV1/SiyBg=
modernc.org/libc v1.11.49/go.mod h1:9JrJuK5WTtoTWIFQ7QjX2Mb/bagYdZdscI3xrvHbXjE=
modernc.org/libc v1.11.51/go.mod h1:R9I8u9TS+meaWLdbfQhq2kFknTW0O3aw3kEMqDDxMaM=
modernc.org/libc v1.11.53/go.mod h1:5ip5vWYPAoMulkQ5XlSJTy12Sz5U6blOQiYasilVPsU=
modernc.org/libc v1.11.54/go.mod h1:S/FVnskbzVUrjfBqlGFIPA5m7UwB3n9fojHhCNfSsnw=
modernc.org/libc v1.11.55/go.mod h1:j2A5YBRm6HjNkoSs/fzZrSxCuwWqcMYTDPLNx0URn3M=
modernc.org/libc v1.11.56/go.mod h1:pakHkg5JdMLt2OgRadpPOTnyRXm/uzu+Yyg/LSLdi18=
modernc.org/libc v1.11.58/go.mod h1:ns94Rxv0OWyoQrDqMFfWwka2BcaF6/61CqJRK9LP7S8=
modernc.org/libc v1.11.71/go.mod h1:DUOmMYe+IvKi9n6Mycyx3DbjfzSKrdr/0Vgt3j7P5gw=
modernc.org/libc v1.11.75/go.mod h1:dGRVugT6edz361wmD9gk6ax1AbDSe0x5vji0dGJiPT0=
modernc.org/libc v1.11.82/go.mod h1:NF+Ek1BOl2jeC7lw3a7Jj5PWyHPwWD4aq3wVKxqV1fI=
modernc.org/libc v1.11.86/go.mod h1:ePuYgoQLmvxdNT06RpGnaDKJmDNEkV7ZPKI2jnsvZoE=
modernc.org/libc v1.11.87/go.mod h1:Qvd5iXTeLhI5PS0XSyqMY99282y+3euapQFxM7jYnpY=
modernc.org/libc v1.11.88/go.mod h1:h3oIVe8dxmTcchcFuCcJ4nAWaoiwzKCdv82MM0oiIdQ=
modernc.org/libc v1.11.98/go.mod h1:ynK5sbjsU77AP+nn61+k+wxUGRx9rOFcIqWYYMaDZ4c=
modernc.org/libc v1.11.101/go.mod h1:wLLYgEiY2D17NbBOEp+mIJJJBGSiy7fLL4ZrGGZ+8jI=
modernc.org/libc v1.12.0/go.mod h1:2MH3DaF/gCU8i/UBiVE1VFRos4o523M7zipmwH8SIgQ=
modernc.org/libc v1.13.1/go.mod h1:npFeGWjmZTjFeWALQLrvklVmAxv4m80jnG3+xI8FdJk=
modernc.org/libc v1.13.2/go.mod h1:npFeGWjmZTjFeWALQLrvklVmAxv4m80jnG3+xI8FdJk=
modernc.org/libc v1.14.1 h1:rwx9uVJU/fEmsmV5ECGRwdAiXgUm6k6tsFA+L8kQb6E=
modernc.org/libc v1.14.1/go.mod h1:npFeGWjmZTjFeWALQLrvklVmAxv4m80jnG3+xI8FdJk=
modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
modernc.org/mathutil v1.4.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
modernc.org/mathutil v1.4.1 h1:ij3fYGe8zBF4Vu+g0oT7mB06r8sqGWKuJu1yXeR4by8=
modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
modernc.org/memory v1.0.4/go.mod h1:nV2OApxradM3/OVbs2/0OsP6nPfakXpi50C7dcoHXlc=
modernc.org/memory v1.0.5 h1:XRch8trV7GgvTec2i7jc33YlUI0RKVDBvZ5eZ5m8y14=
modernc.org/memory v1.0.5/go.mod h1:B7OYswTRnfGg+4tDH1t1OeUNnsy2viGTdME4tzd+IjM=
modernc.org/opt v0.1.1 h1:/0RX92k9vwVeDXj+Xn23DKp2VJubL7k8qNffND6qn3A=
modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
modernc.org/sqlite v1.14.5 h1:bYrrjwH9Y7QUGk1MbchZDhRfmpGuEAs/D45sVjNbfvs=
modernc.org/sqlite v1.14.5/go.mod h1:YyX5Rx0WbXokitdWl2GJIDy4BrPxBP0PwwhpXOHCDLE=
modernc.org/strutil v1.1.1 h1:xv+J1BXY3Opl2ALrBwyfEikFAj8pmqcpnfmuwUwcozs=
modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw=
modernc.org/tcl v1.10.0 h1:vux2MNFhSXYqD8Kq4Uc9RjWcgv2c7Atx3da3VpLPPEw=
modernc.org/tcl v1.10.0/go.mod h1:WzWapmP/7dHVhFoyPpEaNSVTL8xtewhouN/cqSJ5A2s=
modernc.org/token v1.0.0 h1:a0jaWiNMDhDUtqOj09wvjWWAqd3q7WpBulmL9H2egsk=
modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
modernc.org/z v1.2.21/go.mod h1:uXrObx4pGqXWIMliC5MiKuwAyMrltzwpteOFUP1PWCc=
modernc.org/z v1.3.0 h1:4RWULo1Nvaq5ZBhbLe74u8p6tV4Mmm0ZrPBXYPm/xjM=
modernc.org/z v1.3.0/go.mod h1:+mvgLH814oDjtATDdT3rs84JnUIpkvAF5B8AVkNlE2g=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=

23
main.go
View File

@ -2,6 +2,7 @@ package main
import ( import (
"fmt" "fmt"
"os"
"mapserver/app" "mapserver/app"
"mapserver/mapobject" "mapserver/mapobject"
"mapserver/params" "mapserver/params"
@ -13,11 +14,19 @@ import (
) )
func main() { func main() {
//Parse command line //get Env or Default value
env := func(key string, defaultVal string) string {
val, ok := os.LookupEnv(key)
if !ok {
return defaultVal
}
return val
}
//Parse command line
p := params.Parse() p := params.Parse()
if p.Debug { if p.Debug || env("MT_LOGLEVEL", "INFO") == "DEBUG" {
logrus.SetLevel(logrus.DebugLevel) logrus.SetLevel(logrus.DebugLevel)
} else { } else {
logrus.SetLevel(logrus.InfoLevel) logrus.SetLevel(logrus.InfoLevel)
@ -39,15 +48,17 @@ func main() {
} }
//parse Config //parse Config
cfg, err := app.ParseConfig(app.ConfigFile) cfg, err := app.ParseConfig(env("MT_CONFIG_PATH", app.ConfigFile))
if err != nil { if err != nil {
panic(err) panic(err)
} }
//write back config with all values //write back config with all values
err = cfg.Save() if env("MT_READONLY", "false") != "true" {
if err != nil { err = cfg.Save()
panic(err) if err != nil {
panic(err)
}
} }
//exit after creating the config //exit after creating the config

View File

@ -1,7 +1,6 @@
package mapblockaccessor package mapblockaccessor
import ( import (
"mapserver/coords"
"mapserver/eventbus" "mapserver/eventbus"
"mapserver/types" "mapserver/types"
"sync" "sync"
@ -14,56 +13,61 @@ import (
var lock = &sync.RWMutex{} var lock = &sync.RWMutex{}
func (a *MapBlockAccessor) GetMapBlock(pos *coords.MapBlockCoords) (*mapparser.MapBlock, error) { func (a *MapBlockAccessor) GetMapBlock(pos *types.MapBlockCoords) (*mapparser.MapBlock, error) {
cache_enabled := a.maxcount > 0
key := getKey(pos) key := getKey(pos)
//maintenance if cache_enabled {
cacheBlocks.Set(float64(a.blockcache.ItemCount()))
if a.blockcache.ItemCount() > a.maxcount { //maintenance
//flush cache cacheBlocks.Set(float64(a.blockcache.ItemCount()))
fields := logrus.Fields{ if a.blockcache.ItemCount() > a.maxcount {
"cached items": a.blockcache.ItemCount(), //flush cache
"maxcount": a.maxcount, fields := logrus.Fields{
"cached items": a.blockcache.ItemCount(),
"maxcount": a.maxcount,
}
logrus.WithFields(fields).Debug("Flushing cache")
a.blockcache.Flush()
} }
logrus.WithFields(fields).Debug("Flushing cache")
a.blockcache.Flush() //read section
} lock.RLock()
//read section cachedblock, found := a.blockcache.Get(key)
lock.RLock() if found {
defer lock.RUnlock()
cachedblock, found := a.blockcache.Get(key) getCacheHitCount.Inc()
if found { if cachedblock == nil {
defer lock.RUnlock() return nil, nil
} else {
getCacheHitCount.Inc() return cachedblock.(*mapparser.MapBlock), nil
if cachedblock == nil { }
return nil, nil
} else {
return cachedblock.(*mapparser.MapBlock), nil
} }
}
//end read //end read
lock.RUnlock() lock.RUnlock()
timer := prometheus.NewTimer(dbGetDuration) timer := prometheus.NewTimer(dbGetDuration)
defer timer.ObserveDuration() defer timer.ObserveDuration()
//write section //write section
lock.Lock() lock.Lock()
defer lock.Unlock() defer lock.Unlock()
//try read //try read
cachedblock, found = a.blockcache.Get(key) cachedblock, found = a.blockcache.Get(key)
if found { if found {
getCacheHitCount.Inc() getCacheHitCount.Inc()
if cachedblock == nil { if cachedblock == nil {
return nil, nil return nil, nil
} else { } else {
return cachedblock.(*mapparser.MapBlock), nil return cachedblock.(*mapparser.MapBlock), nil
}
} }
} }
block, err := a.accessor.GetBlock(pos) block, err := a.accessor.GetBlock(pos)
@ -73,12 +77,16 @@ func (a *MapBlockAccessor) GetMapBlock(pos *coords.MapBlockCoords) (*mapparser.M
if block == nil { if block == nil {
//no mapblock here //no mapblock here
cacheBlockCount.Inc() if cache_enabled {
a.blockcache.Set(key, nil, cache.DefaultExpiration) cacheBlockCount.Inc()
a.blockcache.Set(key, nil, cache.DefaultExpiration)
}
return nil, nil return nil, nil
} }
getCacheMissCount.Inc() if cache_enabled {
getCacheMissCount.Inc()
}
mapblock, err := mapparser.Parse(block.Data) mapblock, err := mapparser.Parse(block.Data)
if err != nil { if err != nil {
@ -87,8 +95,10 @@ func (a *MapBlockAccessor) GetMapBlock(pos *coords.MapBlockCoords) (*mapparser.M
a.Eventbus.Emit(eventbus.MAPBLOCK_RENDERED, types.NewParsedMapblock(mapblock, pos)) a.Eventbus.Emit(eventbus.MAPBLOCK_RENDERED, types.NewParsedMapblock(mapblock, pos))
cacheBlockCount.Inc() if cache_enabled {
a.blockcache.Set(key, mapblock, cache.DefaultExpiration) cacheBlockCount.Inc()
a.blockcache.Set(key, mapblock, cache.DefaultExpiration)
}
return mapblock, nil return mapblock, nil
} }

View File

@ -2,7 +2,6 @@ package mapblockaccessor
import ( import (
"mapserver/eventbus" "mapserver/eventbus"
"mapserver/layer"
"mapserver/settings" "mapserver/settings"
"mapserver/types" "mapserver/types"
@ -19,7 +18,7 @@ type FindNextLegacyBlocksResult struct {
LastMtime int64 LastMtime int64
} }
func (a *MapBlockAccessor) FindNextLegacyBlocks(s settings.Settings, layers []*layer.Layer, limit int) (*FindNextLegacyBlocksResult, error) { func (a *MapBlockAccessor) FindNextLegacyBlocks(s settings.Settings, layers []*types.Layer, limit int) (*FindNextLegacyBlocksResult, error) {
nextResult, err := a.accessor.FindNextInitialBlocks(s, layers, limit) nextResult, err := a.accessor.FindNextInitialBlocks(s, layers, limit)

View File

@ -1,11 +0,0 @@
package mapblockaccessor
import (
"github.com/sirupsen/logrus"
)
var log *logrus.Entry
func init() {
log = logrus.WithFields(logrus.Fields{"prefix": "mapblockaccessor"})
}

View File

@ -2,9 +2,9 @@ package mapblockaccessor
import ( import (
"fmt" "fmt"
"mapserver/coords"
"mapserver/db" "mapserver/db"
"mapserver/eventbus" "mapserver/eventbus"
"mapserver/types"
"time" "time"
@ -18,7 +18,7 @@ type MapBlockAccessor struct {
maxcount int maxcount int
} }
func getKey(pos *coords.MapBlockCoords) string { func getKey(pos *types.MapBlockCoords) string {
return fmt.Sprintf("Coord %d/%d/%d", pos.X, pos.Y, pos.Z) return fmt.Sprintf("Coord %d/%d/%d", pos.X, pos.Y, pos.Z)
} }

View File

@ -2,9 +2,9 @@ package mapblockaccessor
import ( import (
"io/ioutil" "io/ioutil"
"mapserver/coords"
"mapserver/db/sqlite" "mapserver/db/sqlite"
"mapserver/testutils" "mapserver/testutils"
"mapserver/types"
"os" "os"
"testing" "testing"
"time" "time"
@ -33,7 +33,7 @@ func TestSimpleAccess(t *testing.T) {
} }
cache := NewMapBlockAccessor(a, 500*time.Millisecond, 1000*time.Millisecond, 1000) cache := NewMapBlockAccessor(a, 500*time.Millisecond, 1000*time.Millisecond, 1000)
mb, err := cache.GetMapBlock(coords.NewMapBlockCoords(0, 0, 0)) mb, err := cache.GetMapBlock(types.NewMapBlockCoords(0, 0, 0))
if err != nil { if err != nil {
panic(err) panic(err)

View File

@ -1,9 +1,7 @@
package mapblockaccessor package mapblockaccessor
import ( import (
"mapserver/coords"
"mapserver/eventbus" "mapserver/eventbus"
"mapserver/layer"
"mapserver/types" "mapserver/types"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
@ -14,13 +12,13 @@ import (
type FindMapBlocksByMtimeResult struct { type FindMapBlocksByMtimeResult struct {
HasMore bool HasMore bool
LastPos *coords.MapBlockCoords LastPos *types.MapBlockCoords
LastMtime int64 LastMtime int64
List []*types.ParsedMapblock List []*types.ParsedMapblock
UnfilteredCount int UnfilteredCount int
} }
func (a *MapBlockAccessor) FindMapBlocksByMtime(lastmtime int64, limit int, layerfilter []*layer.Layer) (*FindMapBlocksByMtimeResult, error) { func (a *MapBlockAccessor) FindMapBlocksByMtime(lastmtime int64, limit int, layerfilter []*types.Layer) (*FindMapBlocksByMtimeResult, error) {
fields := logrus.Fields{ fields := logrus.Fields{
"lastmtime": lastmtime, "lastmtime": lastmtime,
@ -41,7 +39,7 @@ func (a *MapBlockAccessor) FindMapBlocksByMtime(lastmtime int64, limit int, laye
result := FindMapBlocksByMtimeResult{} result := FindMapBlocksByMtimeResult{}
mblist := make([]*types.ParsedMapblock, 0) mblist := make([]*types.ParsedMapblock, 0)
var newlastpos *coords.MapBlockCoords var newlastpos *types.MapBlockCoords
result.HasMore = len(blocks) == limit result.HasMore = len(blocks) == limit
result.UnfilteredCount = len(blocks) result.UnfilteredCount = len(blocks)
@ -51,7 +49,7 @@ func (a *MapBlockAccessor) FindMapBlocksByMtime(lastmtime int64, limit int, laye
result.LastMtime = block.Mtime result.LastMtime = block.Mtime
} }
currentLayer := layer.FindLayerByY(layerfilter, block.Pos.Y) currentLayer := types.FindLayerByY(layerfilter, block.Pos.Y)
if currentLayer == nil { if currentLayer == nil {
continue continue

View File

@ -1,13 +1,13 @@
package mapblockaccessor package mapblockaccessor
import ( import (
"mapserver/coords" "mapserver/types"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
cache "github.com/patrickmn/go-cache" cache "github.com/patrickmn/go-cache"
) )
func (a *MapBlockAccessor) Update(pos *coords.MapBlockCoords, mb *mapparser.MapBlock) { func (a *MapBlockAccessor) Update(pos *types.MapBlockCoords, mb *mapparser.MapBlock) {
key := getKey(pos) key := getKey(pos)
cacheBlockCount.Inc() cacheBlockCount.Inc()
a.blockcache.Set(key, mb, cache.DefaultExpiration) a.blockcache.Set(key, mb, cache.DefaultExpiration)

View File

@ -4,11 +4,12 @@ import (
"errors" "errors"
"image" "image"
"image/color" "image/color"
"mapserver/colormapping"
"mapserver/coords"
"mapserver/mapblockaccessor" "mapserver/mapblockaccessor"
"mapserver/types"
"time" "time"
"github.com/minetest-go/colormapping"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
@ -72,13 +73,13 @@ func addColorComponent(c *color.RGBA, value int) *color.RGBA {
} }
} }
func (r *MapBlockRenderer) Render(pos1, pos2 *coords.MapBlockCoords) (*image.NRGBA, error) { func (r *MapBlockRenderer) Render(pos1, pos2 *types.MapBlockCoords) (*image.NRGBA, error) {
if pos1.X != pos2.X { if pos1.X != pos2.X {
return nil, errors.New("X does not line up") return nil, errors.New("x does not line up")
} }
if pos1.Z != pos2.Z { if pos1.Z != pos2.Z {
return nil, errors.New("Z does not line up") return nil, errors.New("z does not line up")
} }
renderedMapblocks.Inc() renderedMapblocks.Inc()
@ -110,7 +111,7 @@ func (r *MapBlockRenderer) Render(pos1, pos2 *coords.MapBlockCoords) (*image.NRG
} }
for mapBlockY := maxY; mapBlockY >= minY; mapBlockY-- { for mapBlockY := maxY; mapBlockY >= minY; mapBlockY-- {
currentPos := coords.NewMapBlockCoords(pos1.X, mapBlockY, pos1.Z) currentPos := types.NewMapBlockCoords(pos1.X, mapBlockY, pos1.Z)
mb, err := r.accessor.GetMapBlock(currentPos) mb, err := r.accessor.GetMapBlock(currentPos)
if err != nil { if err != nil {
@ -141,6 +142,9 @@ func (r *MapBlockRenderer) Render(pos1, pos2 *coords.MapBlockCoords) (*image.NRG
continue continue
} }
// clamp alpha channel to max
c.A = 255
if r.enableShadow { if r.enableShadow {
var left, leftAbove, top, topAbove string var left, leftAbove, top, topAbove string
@ -153,7 +157,7 @@ func (r *MapBlockRenderer) Render(pos1, pos2 *coords.MapBlockCoords) (*image.NRG
} else { } else {
//neighbouring mapblock //neighbouring mapblock
neighbourPos := coords.NewMapBlockCoords(currentPos.X-1, currentPos.Y, currentPos.Z) neighbourPos := types.NewMapBlockCoords(currentPos.X-1, currentPos.Y, currentPos.Z)
neighbourMapblock, err := r.accessor.GetMapBlock(neighbourPos) neighbourMapblock, err := r.accessor.GetMapBlock(neighbourPos)
if neighbourMapblock != nil && err == nil { if neighbourMapblock != nil && err == nil {
@ -173,7 +177,7 @@ func (r *MapBlockRenderer) Render(pos1, pos2 *coords.MapBlockCoords) (*image.NRG
} else { } else {
//neighbouring mapblock //neighbouring mapblock
neighbourPos := coords.NewMapBlockCoords(currentPos.X, currentPos.Y, currentPos.Z+1) neighbourPos := types.NewMapBlockCoords(currentPos.X, currentPos.Y, currentPos.Z+1)
neighbourMapblock, err := r.accessor.GetMapBlock(neighbourPos) neighbourMapblock, err := r.accessor.GetMapBlock(neighbourPos)
if neighbourMapblock != nil && err == nil { if neighbourMapblock != nil && err == nil {

View File

@ -2,15 +2,16 @@ package mapblockrenderer
import ( import (
"io/ioutil" "io/ioutil"
"mapserver/colormapping"
"mapserver/coords"
"mapserver/db/sqlite" "mapserver/db/sqlite"
"mapserver/mapblockaccessor" "mapserver/mapblockaccessor"
"mapserver/testutils" "mapserver/testutils"
"mapserver/types"
"os" "os"
"testing" "testing"
"time" "time"
"github.com/minetest-go/colormapping"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
@ -41,7 +42,7 @@ func createRenderer(b *testing.B) (*MapBlockRenderer, callback) {
cache := mapblockaccessor.NewMapBlockAccessor(a, 500*time.Millisecond, 1000*time.Millisecond, 1000) cache := mapblockaccessor.NewMapBlockAccessor(a, 500*time.Millisecond, 1000*time.Millisecond, 1000)
c := colormapping.NewColorMapping() c := colormapping.NewColorMapping()
_, err = c.LoadVFSColors("colors/vanessa.txt") err = c.LoadDefaults()
if err != nil { if err != nil {
b.Fatal(err) b.Fatal(err)
} }
@ -58,8 +59,8 @@ func BenchmarkRenderEmptySingle(b *testing.B) {
for n := 0; n < b.N; n++ { for n := 0; n < b.N; n++ {
pos1 := coords.NewMapBlockCoords(10, 0, 10) pos1 := types.NewMapBlockCoords(10, 0, 10)
pos2 := coords.NewMapBlockCoords(10, 0, 10) pos2 := types.NewMapBlockCoords(10, 0, 10)
_, err := r.Render(pos1, pos2) _, err := r.Render(pos1, pos2)
@ -75,8 +76,8 @@ func BenchmarkRenderSingle(b *testing.B) {
for n := 0; n < b.N; n++ { for n := 0; n < b.N; n++ {
pos1 := coords.NewMapBlockCoords(0, 0, 0) pos1 := types.NewMapBlockCoords(0, 0, 0)
pos2 := coords.NewMapBlockCoords(0, 0, 0) pos2 := types.NewMapBlockCoords(0, 0, 0)
_, err := r.Render(pos1, pos2) _, err := r.Render(pos1, pos2)
@ -92,8 +93,8 @@ func BenchmarkRenderStride(b *testing.B) {
for n := 0; n < b.N; n++ { for n := 0; n < b.N; n++ {
pos1 := coords.NewMapBlockCoords(0, 10, 0) pos1 := types.NewMapBlockCoords(0, 10, 0)
pos2 := coords.NewMapBlockCoords(0, -1, 0) pos2 := types.NewMapBlockCoords(0, -1, 0)
_, err := r.Render(pos1, pos2) _, err := r.Render(pos1, pos2)
@ -109,8 +110,8 @@ func BenchmarkRenderBigStride(b *testing.B) {
for n := 0; n < b.N; n++ { for n := 0; n < b.N; n++ {
pos1 := coords.NewMapBlockCoords(0, 1000, 0) pos1 := types.NewMapBlockCoords(0, 1000, 0)
pos2 := coords.NewMapBlockCoords(0, -1000, 0) pos2 := types.NewMapBlockCoords(0, -1000, 0)
_, err := r.Render(pos1, pos2) _, err := r.Render(pos1, pos2)

View File

@ -3,24 +3,25 @@ package mapblockrenderer
import ( import (
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"mapserver/colormapping"
"mapserver/coords" "mapserver/coords"
"mapserver/db/sqlite" "mapserver/db/sqlite"
"mapserver/layer"
"mapserver/mapblockaccessor" "mapserver/mapblockaccessor"
"mapserver/testutils" "mapserver/testutils"
"mapserver/types"
"os" "os"
"testing" "testing"
"time" "time"
"github.com/minetest-go/colormapping"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
func TestSimpleRender(t *testing.T) { func TestSimpleRender(t *testing.T) {
logrus.SetLevel(logrus.InfoLevel) logrus.SetLevel(logrus.InfoLevel)
layers := []*layer.Layer{ layers := []*types.Layer{
&layer.Layer{ {
Id: 0, Id: 0,
Name: "Base", Name: "Base",
From: -16, From: -16,
@ -47,7 +48,7 @@ func TestSimpleRender(t *testing.T) {
cache := mapblockaccessor.NewMapBlockAccessor(a, 500*time.Millisecond, 1000*time.Millisecond, 1000) cache := mapblockaccessor.NewMapBlockAccessor(a, 500*time.Millisecond, 1000*time.Millisecond, 1000)
c := colormapping.NewColorMapping() c := colormapping.NewColorMapping()
_, err = c.LoadVFSColors("colors/vanessa.txt") err = c.LoadDefaults()
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -80,8 +81,8 @@ func TestSimpleRender(t *testing.T) {
for x := from; x < to; x++ { for x := from; x < to; x++ {
for z := from; z < to; z++ { for z := from; z < to; z++ {
pos1 := coords.NewMapBlockCoords(x, 10, z) pos1 := types.NewMapBlockCoords(x, 10, z)
pos2 := coords.NewMapBlockCoords(x, -1, z) pos2 := types.NewMapBlockCoords(x, -1, z)
jobs <- JobData{Pos1: pos1, Pos2: pos2} jobs <- JobData{Pos1: pos1, Pos2: pos2}
} }

View File

@ -3,12 +3,12 @@ package mapblockrenderer
import ( import (
"bytes" "bytes"
"image/png" "image/png"
"mapserver/coords" "mapserver/types"
"time" "time"
) )
type JobData struct { type JobData struct {
Pos1, Pos2 *coords.MapBlockCoords Pos1, Pos2 *types.MapBlockCoords
} }
type JobResult struct { type JobResult struct {

View File

@ -1,31 +1,28 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
) )
type ATM struct{} type ATM struct{}
func (this *ATM) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { func (this *ATM) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
nodename := block.GetNodeName(x, y, z) nodename := block.GetNodeName(x, y, z)
o := mapobjectdb.NewMapObject(mbpos, x, y, z, "atm") o := mapobjectdb.NewMapObject(mbpos, x, y, z, "atm")
if nodename == "atm:wtt" { switch nodename {
o.Attributes["type"] = "wiretransfer" case "atm:wtt", "um_wtt:wtt":
o.Attributes["type"] = "wiretransfer"
} else if nodename == "atm:atm2" { case "atm:atm2", "um_atm:atm_2":
o.Attributes["type"] = "atm2" o.Attributes["type"] = "atm2"
case "atm:atm3", "um_atm:atm_3":
} else if nodename == "atm:atm3" { o.Attributes["type"] = "atm3"
o.Attributes["type"] = "atm3" default:
o.Attributes["type"] = "atm"
} else {
o.Attributes["type"] = "atm"
} }
return o return o

View File

@ -1,8 +1,8 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"strconv" "strconv"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
@ -10,7 +10,7 @@ import (
type BonesBlock struct{} type BonesBlock struct{}
func (this *BonesBlock) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { func (this *BonesBlock) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
md := block.Metadata.GetMetadata(x, y, z) md := block.Metadata.GetMetadata(x, y, z)
invMap := block.Metadata.GetInventoryMapAtPos(x, y, z) invMap := block.Metadata.GetInventoryMapAtPos(x, y, z)

View File

@ -1,15 +1,15 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
) )
type BorderBlock struct{} type BorderBlock struct{}
func (this *BorderBlock) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { func (this *BorderBlock) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
md := block.Metadata.GetMetadata(x, y, z) md := block.Metadata.GetMetadata(x, y, z)
o := mapobjectdb.NewMapObject(mbpos, x, y, z, "border") o := mapobjectdb.NewMapObject(mbpos, x, y, z, "border")

View File

@ -1,15 +1,15 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
) )
type DigilineLcdBlock struct{} type DigilineLcdBlock struct{}
func (this *DigilineLcdBlock) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { func (this *DigilineLcdBlock) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
md := block.Metadata.GetMetadata(x, y, z) md := block.Metadata.GetMetadata(x, y, z)
o := mapobjectdb.NewMapObject(mbpos, x, y, z, "digilinelcd") o := mapobjectdb.NewMapObject(mbpos, x, y, z, "digilinelcd")

View File

@ -1,15 +1,15 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
) )
type DigitermsBlock struct{} type DigitermsBlock struct{}
func (this *DigitermsBlock) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { func (this *DigitermsBlock) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
md := block.Metadata.GetMetadata(x, y, z) md := block.Metadata.GetMetadata(x, y, z)
o := mapobjectdb.NewMapObject(mbpos, x, y, z, "digiterm") o := mapobjectdb.NewMapObject(mbpos, x, y, z, "digiterm")

View File

@ -1,9 +1,9 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/luaparser" "mapserver/luaparser"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"math" "math"
"strconv" "strconv"
@ -13,7 +13,7 @@ import (
type FancyVend struct{} type FancyVend struct{}
func (this *FancyVend) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { func (this *FancyVend) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
md := block.Metadata.GetMetadata(x, y, z) md := block.Metadata.GetMetadata(x, y, z)
nodename := block.GetNodeName(x, y, z) nodename := block.GetNodeName(x, y, z)
invMap := block.Metadata.GetInventoryMapAtPos(x, y, z) invMap := block.Metadata.GetInventoryMapAtPos(x, y, z)

View File

@ -1,15 +1,15 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
) )
type JumpdriveBlock struct{} type JumpdriveBlock struct{}
func (this *JumpdriveBlock) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { func (this *JumpdriveBlock) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
md := block.Metadata.GetMetadata(x, y, z) md := block.Metadata.GetMetadata(x, y, z)
o := mapobjectdb.NewMapObject(mbpos, x, y, z, "jumpdrive") o := mapobjectdb.NewMapObject(mbpos, x, y, z, "jumpdrive")

View File

@ -1,15 +1,15 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
) )
type LabelBlock struct{} type LabelBlock struct{}
func (this *LabelBlock) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { func (this *LabelBlock) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
md := block.Metadata.GetMetadata(x, y, z) md := block.Metadata.GetMetadata(x, y, z)
o := mapobjectdb.NewMapObject(mbpos, x, y, z, "label") o := mapobjectdb.NewMapObject(mbpos, x, y, z, "label")

View File

@ -12,11 +12,11 @@ import (
) )
type MapObjectListener interface { type MapObjectListener interface {
onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject
} }
type MapMultiObjectListener interface { type MapMultiObjectListener interface {
onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) []*mapobjectdb.MapObject onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) []*mapobjectdb.MapObject
} }
type Listener struct { type Listener struct {

View File

@ -1,15 +1,15 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
) )
type Locator struct{} type Locator struct{}
func (this *Locator) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { func (this *Locator) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
md := block.Metadata.GetMetadata(x, y, z) md := block.Metadata.GetMetadata(x, y, z)
nodename := block.GetNodeName(x, y, z) nodename := block.GetNodeName(x, y, z)

View File

@ -1,15 +1,15 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
) )
type LuaControllerBlock struct{} type LuaControllerBlock struct{}
func (this *LuaControllerBlock) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { func (this *LuaControllerBlock) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
//md := block.Metadata.GetMetadata(x, y, z) //md := block.Metadata.GetMetadata(x, y, z)
nodename := block.GetNodeName(x, y, z) nodename := block.GetNodeName(x, y, z)

View File

@ -1,15 +1,15 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
) )
type MissionBlock struct{} type MissionBlock struct{}
func (this *MissionBlock) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { func (this *MissionBlock) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
md := block.Metadata.GetMetadata(x, y, z) md := block.Metadata.GetMetadata(x, y, z)
if md["hidden"] == "1" { if md["hidden"] == "1" {

View File

@ -1,15 +1,15 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
) )
type NuclearReactorBlock struct{} type NuclearReactorBlock struct{}
func (this *NuclearReactorBlock) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { func (this *NuclearReactorBlock) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
md := block.Metadata.GetMetadata(x, y, z) md := block.Metadata.GetMetadata(x, y, z)
o := mapobjectdb.NewMapObject(mbpos, x, y, z, "nuclearreactor") o := mapobjectdb.NewMapObject(mbpos, x, y, z, "nuclearreactor")

24
mapobject/phonograph.go Normal file
View File

@ -0,0 +1,24 @@
package mapobject
import (
"mapserver/mapobjectdb"
"mapserver/types"
"github.com/minetest-go/mapparser"
)
type Phonograph struct{}
func (this *Phonograph) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
md := block.Metadata.GetMetadata(x, y, z)
if _, ok := md["song_title"]; !ok {
return nil
}
o := mapobjectdb.NewMapObject(mbpos, x, y, z, "phonograph")
o.Attributes["song_title"] = md["song_title"]
o.Attributes["song_artist"] = md["song_artist"]
return o
}

View File

@ -1,8 +1,8 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
) )
@ -11,13 +11,15 @@ type PoiBlock struct {
Color string Color string
} }
func (this *PoiBlock) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { func (this *PoiBlock) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
md := block.Metadata.GetMetadata(x, y, z) md := block.Metadata.GetMetadata(x, y, z)
o := mapobjectdb.NewMapObject(mbpos, x, y, z, "poi") o := mapobjectdb.NewMapObject(mbpos, x, y, z, "poi")
o.Attributes["name"] = md["name"] o.Attributes["name"] = md["name"]
o.Attributes["category"] = md["category"] o.Attributes["category"] = md["category"]
o.Attributes["addr"] = md["addr"]
o.Attributes["url"] = md["url"] o.Attributes["url"] = md["url"]
o.Attributes["image"] = md["image"]
o.Attributes["owner"] = md["owner"] o.Attributes["owner"] = md["owner"]
o.Attributes["icon"] = md["icon"] o.Attributes["icon"] = md["icon"]
o.Attributes["color"] = this.Color o.Attributes["color"] = this.Color

View File

@ -1,15 +1,15 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
) )
type PrivProtectorBlock struct{} type PrivProtectorBlock struct{}
func (this *PrivProtectorBlock) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { func (this *PrivProtectorBlock) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
md := block.Metadata.GetMetadata(x, y, z) md := block.Metadata.GetMetadata(x, y, z)
o := mapobjectdb.NewMapObject(mbpos, x, y, z, "privprotector") o := mapobjectdb.NewMapObject(mbpos, x, y, z, "privprotector")

View File

@ -1,15 +1,15 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
) )
type ProtectorBlock struct{} type ProtectorBlock struct{}
func (this *ProtectorBlock) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { func (this *ProtectorBlock) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
md := block.Metadata.GetMetadata(x, y, z) md := block.Metadata.GetMetadata(x, y, z)
o := mapobjectdb.NewMapObject(mbpos, x, y, z, "protector") o := mapobjectdb.NewMapObject(mbpos, x, y, z, "protector")

View File

@ -1,15 +1,15 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
) )
type QuarryBlock struct{} type QuarryBlock struct{}
func (this *QuarryBlock) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { func (this *QuarryBlock) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
md := block.Metadata.GetMetadata(x, y, z) md := block.Metadata.GetMetadata(x, y, z)
if md["owner"] == "" { if md["owner"] == "" {

View File

@ -41,21 +41,23 @@ func Setup(ctx *app.App) {
//travelnet //travelnet
if ctx.Config.MapObjects.Travelnet { if ctx.Config.MapObjects.Travelnet {
l.AddMapObject("travelnet:travelnet", &TravelnetBlock{}) tb := &TravelnetBlock{}
l.AddMapObject("travelnet:travelnet_red", &TravelnetBlock{}) l.AddMapObject("travelnet:travelnet", tb)
l.AddMapObject("travelnet:travelnet_orange", &TravelnetBlock{}) l.AddMapObject("travelnet:travelnet_red", tb)
l.AddMapObject("travelnet:travelnet_blue", &TravelnetBlock{}) l.AddMapObject("travelnet:travelnet_orange", tb)
l.AddMapObject("travelnet:travelnet_cyan", &TravelnetBlock{}) l.AddMapObject("travelnet:travelnet_blue", tb)
l.AddMapObject("travelnet:travelnet_green", &TravelnetBlock{}) l.AddMapObject("travelnet:travelnet_cyan", tb)
l.AddMapObject("travelnet:travelnet_dark_green", &TravelnetBlock{}) l.AddMapObject("travelnet:travelnet_green", tb)
l.AddMapObject("travelnet:travelnet_violet", &TravelnetBlock{}) l.AddMapObject("travelnet:travelnet_dark_green", tb)
l.AddMapObject("travelnet:travelnet_pink", &TravelnetBlock{}) l.AddMapObject("travelnet:travelnet_violet", tb)
l.AddMapObject("travelnet:travelnet_magenta", &TravelnetBlock{}) l.AddMapObject("travelnet:travelnet_pink", tb)
l.AddMapObject("travelnet:travelnet_brown", &TravelnetBlock{}) l.AddMapObject("travelnet:travelnet_magenta", tb)
l.AddMapObject("travelnet:travelnet_grey", &TravelnetBlock{}) l.AddMapObject("travelnet:travelnet_brown", tb)
l.AddMapObject("travelnet:travelnet_dark_grey", &TravelnetBlock{}) l.AddMapObject("travelnet:travelnet_grey", tb)
l.AddMapObject("travelnet:travelnet_black", &TravelnetBlock{}) l.AddMapObject("travelnet:travelnet_dark_grey", tb)
l.AddMapObject("travelnet:travelnet_white", &TravelnetBlock{}) l.AddMapObject("travelnet:travelnet_black", tb)
l.AddMapObject("travelnet:travelnet_white", tb)
l.AddMapObject("fancy_travelnet:fancy_travelnet", tb)
} }
//protector //protector
@ -162,10 +164,18 @@ func Setup(ctx *app.App) {
if ctx.Config.MapObjects.ATM { if ctx.Config.MapObjects.ATM {
atm := &ATM{} atm := &ATM{}
// ATMs and WTT of gpcf's mod
l.AddMapObject("atm:atm", atm) l.AddMapObject("atm:atm", atm)
l.AddMapObject("atm:atm2", atm) l.AddMapObject("atm:atm2", atm)
l.AddMapObject("atm:atm3", atm) l.AddMapObject("atm:atm3", atm)
l.AddMapObject("atm:wtt", atm) l.AddMapObject("atm:wtt", atm)
// ATMs and WTT of Unified Money
l.AddMapObject("um_atm:atm_1", atm)
l.AddMapObject("um_atm:atm_2", atm)
l.AddMapObject("um_atm:atm_3", atm)
l.AddMapObject("um_wtt:wtt", atm)
} }
//locator //locator
@ -182,5 +192,15 @@ func Setup(ctx *app.App) {
l.AddMapObject("default:sign_wall_steel", &SignBlock{Material: "steel"}) l.AddMapObject("default:sign_wall_steel", &SignBlock{Material: "steel"})
} }
//Phonograph
if ctx.Config.MapObjects.Phonograph {
l.AddMapObject("phonograph:phonograph", &Phonograph{})
}
//For Sale Sign for Unified Money
if ctx.Config.MapObjects.UnifiefMoneyAreaForSale {
l.AddMapObject("um_area_forsale:for_sale_sign", &UnifiefMoneyAreaForSale{})
}
ctx.MapBlockAccessor.Eventbus.AddListener(&l) ctx.MapBlockAccessor.Eventbus.AddListener(&l)
} }

View File

@ -1,8 +1,8 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
) )
@ -11,7 +11,7 @@ type SignBlock struct {
Material string Material string
} }
func (this *SignBlock) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { func (this *SignBlock) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
md := block.Metadata.GetMetadata(x, y, z) md := block.Metadata.GetMetadata(x, y, z)
o := mapobjectdb.NewMapObject(mbpos, x, y, z, "sign") o := mapobjectdb.NewMapObject(mbpos, x, y, z, "sign")

View File

@ -1,8 +1,8 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"math" "math"
"strconv" "strconv"
@ -11,7 +11,7 @@ import (
type SmartShopBlock struct{} type SmartShopBlock struct{}
func (this *SmartShopBlock) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) []*mapobjectdb.MapObject { func (this *SmartShopBlock) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) []*mapobjectdb.MapObject {
list := make([]*mapobjectdb.MapObject, 0) list := make([]*mapobjectdb.MapObject, 0)
md := block.Metadata.GetMetadata(x, y, z) md := block.Metadata.GetMetadata(x, y, z)

View File

@ -1,15 +1,15 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
) )
type TechnicAnchorBlock struct{} type TechnicAnchorBlock struct{}
func (this *TechnicAnchorBlock) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { func (this *TechnicAnchorBlock) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
md := block.Metadata.GetMetadata(x, y, z) md := block.Metadata.GetMetadata(x, y, z)
o := mapobjectdb.NewMapObject(mbpos, x, y, z, "technicanchor") o := mapobjectdb.NewMapObject(mbpos, x, y, z, "technicanchor")

View File

@ -1,15 +1,15 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
) )
type TechnicSwitchBlock struct{} type TechnicSwitchBlock struct{}
func (this *TechnicSwitchBlock) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { func (this *TechnicSwitchBlock) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
md := block.Metadata.GetMetadata(x, y, z) md := block.Metadata.GetMetadata(x, y, z)
o := mapobjectdb.NewMapObject(mbpos, x, y, z, "technicswitch") o := mapobjectdb.NewMapObject(mbpos, x, y, z, "technicswitch")

View File

@ -1,15 +1,15 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
) )
type TrainBlock struct{} type TrainBlock struct{}
func (this *TrainBlock) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { func (this *TrainBlock) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
md := block.Metadata.GetMetadata(x, y, z) md := block.Metadata.GetMetadata(x, y, z)
o := mapobjectdb.NewMapObject(mbpos, x, y, z, "train") o := mapobjectdb.NewMapObject(mbpos, x, y, z, "train")

View File

@ -1,8 +1,8 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"strings" "strings"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
@ -10,7 +10,7 @@ import (
type TravelnetBlock struct{} type TravelnetBlock struct{}
func (tn *TravelnetBlock) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { func (tn *TravelnetBlock) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
md := block.Metadata.GetMetadata(x, y, z) md := block.Metadata.GetMetadata(x, y, z)
// ignore (P) prefixed stations // ignore (P) prefixed stations

View File

@ -0,0 +1,26 @@
package mapobject
import (
"mapserver/mapobjectdb"
"mapserver/types"
"github.com/minetest-go/mapparser"
)
type UnifiefMoneyAreaForSale struct{}
func (this *UnifiefMoneyAreaForSale) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
md := block.Metadata.GetMetadata(x, y, z)
if _, ok := md["id"]; !ok {
return nil
}
o := mapobjectdb.NewMapObject(mbpos, x, y, z, "um_area_forsale")
o.Attributes["owner"] = md["owner"]
o.Attributes["id"] = md["id"] // ", " seperated
o.Attributes["price"] = md["price"]
o.Attributes["description"] = md["description"]
return o
}

View File

@ -1,15 +1,15 @@
package mapobject package mapobject
import ( import (
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"github.com/minetest-go/mapparser" "github.com/minetest-go/mapparser"
) )
type XPProtectorBlock struct{} type XPProtectorBlock struct{}
func (this *XPProtectorBlock) onMapObject(mbpos *coords.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { func (this *XPProtectorBlock) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject {
md := block.Metadata.GetMetadata(x, y, z) md := block.Metadata.GetMetadata(x, y, z)
o := mapobjectdb.NewMapObject(mbpos, x, y, z, "xpprotector") o := mapobjectdb.NewMapObject(mbpos, x, y, z, "xpprotector")

View File

@ -2,6 +2,7 @@ package mapobjectdb
import ( import (
"mapserver/coords" "mapserver/coords"
"mapserver/types"
"time" "time"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
@ -21,7 +22,7 @@ type Tile struct {
type MapObject struct { type MapObject struct {
//mapblock position //mapblock position
MBPos *coords.MapBlockCoords `json:"mapblock"` MBPos *types.MapBlockCoords `json:"mapblock"`
//block position //block position
X int `json:"x"` X int `json:"x"`
@ -33,7 +34,7 @@ type MapObject struct {
Attributes map[string]string `json:"attributes"` Attributes map[string]string `json:"attributes"`
} }
func NewMapObject(MBPos *coords.MapBlockCoords, x int, y int, z int, _type string) *MapObject { func NewMapObject(MBPos *types.MapBlockCoords, x int, y int, z int, _type string) *MapObject {
fields := logrus.Fields{ fields := logrus.Fields{
"mbpos": MBPos, "mbpos": MBPos,
@ -64,11 +65,11 @@ type SearchAttributeLike struct {
type SearchQuery struct { type SearchQuery struct {
//mapblock position //mapblock position
Pos1 *coords.MapBlockCoords `json:"pos1"` Pos1 *types.MapBlockCoords `json:"pos1"`
Pos2 *coords.MapBlockCoords `json:"pos2"` Pos2 *types.MapBlockCoords `json:"pos2"`
Type string `json:"type"` Type string `json:"type"`
AttributeLike *SearchAttributeLike `json:"attributelike"` AttributeLike *SearchAttributeLike `json:"attributelike"`
Limit *int `json:"limit"` Limit *int `json:"limit"`
} }
type DBAccessor interface { type DBAccessor interface {
@ -77,7 +78,7 @@ type DBAccessor interface {
//Generic map objects (poi, etc) //Generic map objects (poi, etc)
GetMapData(q *SearchQuery) ([]*MapObject, error) GetMapData(q *SearchQuery) ([]*MapObject, error)
RemoveMapData(pos *coords.MapBlockCoords) error RemoveMapData(pos *types.MapBlockCoords) error
AddMapData(data *MapObject) error AddMapData(data *MapObject) error
//Settings //Settings

View File

@ -2,7 +2,7 @@ package mapobjectdb
import ( import (
"fmt" "fmt"
"mapserver/coords" "mapserver/types"
"testing" "testing"
) )
@ -10,7 +10,7 @@ func TestNewMapBlockCoords(t *testing.T) {
attrs := make(map[string]string) attrs := make(map[string]string)
attrs["X"] = "y" attrs["X"] = "y"
pos := coords.NewMapBlockCoords(1, 2, 3) pos := types.NewMapBlockCoords(1, 2, 3)
fmt.Println(pos) fmt.Println(pos)
obj := NewMapObject(pos, 10, 12, 14, "xy") obj := NewMapObject(pos, 10, 12, 14, "xy")

View File

@ -2,21 +2,22 @@ package postgres
import ( import (
"database/sql" "database/sql"
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"unicode/utf8" "unicode/utf8"
"github.com/google/uuid"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
func (db *PostgresAccessor) GetMapData(q *mapobjectdb.SearchQuery) ([]*mapobjectdb.MapObject, error) { func (a *PostgresAccessor) GetMapData(q *mapobjectdb.SearchQuery) ([]*mapobjectdb.MapObject, error) {
var rows *sql.Rows var rows *sql.Rows
var err error var err error
if q.AttributeLike == nil { if q.AttributeLike == nil {
//plain pos search //plain pos search
rows, err = db.db.Query(getMapDataPosQuery, rows, err = a.db.Query(getMapDataPosQuery,
q.Type, q.Type,
q.Pos1.X, q.Pos1.Y, q.Pos1.Z, q.Pos1.X, q.Pos1.Y, q.Pos1.Z,
q.Pos2.X, q.Pos2.Y, q.Pos2.Z, q.Pos2.X, q.Pos2.Y, q.Pos2.Z,
@ -25,7 +26,7 @@ func (db *PostgresAccessor) GetMapData(q *mapobjectdb.SearchQuery) ([]*mapobject
} else { } else {
//attribute like search //attribute like search
rows, err = db.db.Query(getMapDataWithAttributeLikePosQuery, rows, err = a.db.Query(getMapDataWithAttributeLikePosQuery,
q.Type, q.Type,
q.Pos1.X, q.Pos1.Y, q.Pos1.Z, q.Pos1.X, q.Pos1.Y, q.Pos1.Z,
q.Pos2.X, q.Pos2.Y, q.Pos2.Z, q.Pos2.X, q.Pos2.Y, q.Pos2.Z,
@ -42,10 +43,10 @@ func (db *PostgresAccessor) GetMapData(q *mapobjectdb.SearchQuery) ([]*mapobject
result := make([]*mapobjectdb.MapObject, 0) result := make([]*mapobjectdb.MapObject, 0)
var currentObj *mapobjectdb.MapObject var currentObj *mapobjectdb.MapObject
var currentId *int64 var currentUID string
for rows.Next() { for rows.Next() {
var id int64 var id string
var Type string var Type string
var mtime int64 var mtime int64
var x, y, z int var x, y, z int
@ -61,8 +62,8 @@ func (db *PostgresAccessor) GetMapData(q *mapobjectdb.SearchQuery) ([]*mapobject
return nil, err return nil, err
} }
if currentId == nil || *currentId != id { if currentUID == "" || currentUID != id {
pos := coords.NewMapBlockCoords(posx, posy, posz) pos := types.NewMapBlockCoords(posx, posy, posz)
mo := &mapobjectdb.MapObject{ mo := &mapobjectdb.MapObject{
MBPos: pos, MBPos: pos,
Type: Type, Type: Type,
@ -74,7 +75,7 @@ func (db *PostgresAccessor) GetMapData(q *mapobjectdb.SearchQuery) ([]*mapobject
} }
currentObj = mo currentObj = mo
currentId = &id currentUID = id
result = append(result, currentObj) result = append(result, currentObj)
@ -86,12 +87,12 @@ func (db *PostgresAccessor) GetMapData(q *mapobjectdb.SearchQuery) ([]*mapobject
return result, nil return result, nil
} }
func (db *PostgresAccessor) RemoveMapData(pos *coords.MapBlockCoords) error { func (a *PostgresAccessor) RemoveMapData(pos *types.MapBlockCoords) error {
_, err := db.db.Exec(removeMapDataQuery, pos.X, pos.Y, pos.Z) _, err := a.db.Exec(removeMapDataQuery, pos.X, pos.Y, pos.Z)
return err return err
} }
func (db *PostgresAccessor) AddMapData(data *mapobjectdb.MapObject) error { func (a *PostgresAccessor) AddMapData(data *mapobjectdb.MapObject) error {
for k, v := range data.Attributes { for k, v := range data.Attributes {
if !utf8.Valid([]byte(v)) { if !utf8.Valid([]byte(v)) {
@ -106,22 +107,19 @@ func (db *PostgresAccessor) AddMapData(data *mapobjectdb.MapObject) error {
} }
} }
res := db.db.QueryRow(addMapDataQuery, uid := uuid.NewString()
_, err := a.db.Exec(addMapDataQuery,
uid,
data.X, data.Y, data.Z, data.X, data.Y, data.Z,
data.MBPos.X, data.MBPos.Y, data.MBPos.Z, data.MBPos.X, data.MBPos.Y, data.MBPos.Z,
data.Type, data.Mtime) data.Type, data.Mtime)
lastInsertId := 0
err := res.Scan(&lastInsertId)
if err != nil { if err != nil {
return err return err
} }
for k, v := range data.Attributes { for k, v := range data.Attributes {
//TODO: batch insert _, err := a.db.Exec(addMapDataAttributeQuery, uid, k, v)
_, err := db.db.Exec(addMapDataAttributeQuery, lastInsertId, k, v)
if err != nil { if err != nil {
return err return err
} }

View File

@ -2,33 +2,44 @@ package postgres
import ( import (
"database/sql" "database/sql"
"mapserver/public" "embed"
"github.com/golang-migrate/migrate/v4"
"github.com/golang-migrate/migrate/v4/database/postgres"
"github.com/golang-migrate/migrate/v4/source/iofs"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"time"
) )
//go:embed migrations/*.sql
var migrations embed.FS
type PostgresAccessor struct { type PostgresAccessor struct {
db *sql.DB db *sql.DB
} }
func (db *PostgresAccessor) Migrate() error { func (a *PostgresAccessor) Migrate() error {
log.Info("Migrating database") driver, err := postgres.WithInstance(a.db, &postgres.Config{})
start := time.Now()
sql, err := public.Files.ReadFile("sql/postgres_mapobjectdb_migrate.sql")
if err != nil { if err != nil {
return err return err
} }
_, err = db.db.Exec(string(sql)) d, err := iofs.New(migrations, "migrations")
if err != nil { if err != nil {
return err return err
} }
t := time.Now() m, err := migrate.NewWithInstance("iofs", d, "postgres", driver)
elapsed := t.Sub(start) if err != nil {
log.WithFields(logrus.Fields{"elapsed": elapsed}).Info("Migration completed") return err
}
err = m.Up()
if err != nil && err != migrate.ErrNoChange {
return err
}
v, _, _ := m.Version()
logrus.WithFields(logrus.Fields{"version": v}).Info("DB Migrated")
return nil return nil
} }

View File

@ -1,14 +1,14 @@
create table if not exists objects( create table if not exists objects(
id serial primary key, id serial primary key,
x int, x int,
y int, y int,
z int, z int,
posx int, posx int,
posy int, posy int,
posz int, posz int,
type varchar, type varchar,
mtime bigint mtime bigint
); );
create index if not exists objects_pos on objects(posx,posy,posz); create index if not exists objects_pos on objects(posx,posy,posz);

View File

@ -0,0 +1,20 @@
-- add objects.uid
alter table objects add uid uuid not null default gen_random_uuid();
create index objects_uid on objects(uid);
alter table objects add constraint objects_uid_unique UNIQUE (uid);
-- add object_attributes.object_uid and update references
alter table object_attributes add object_uid uuid;
update object_attributes set object_uid = (select uid from objects o where o.id = objectid);
alter table object_attributes alter column object_uid set not null;
alter table object_attributes
add constraint object_attributes_object_uid_fk
FOREIGN KEY (object_uid)
REFERENCES objects(uid)
on delete cascade;
create index object_attributes_object_uid on object_attributes(object_uid);
-- drop old id's
alter table object_attributes drop objectid;
alter table objects drop id;

View File

@ -1,32 +1,32 @@
package postgres package postgres
const getMapDataPosQuery = ` const getMapDataPosQuery = `
select o.id, o.type, o.mtime, select o.uid, o.type, o.mtime,
o.x, o.y, o.z, o.x, o.y, o.z,
o.posx, o.posy, o.posz, o.posx, o.posy, o.posz,
oa.key, oa.value oa.key, oa.value
from objects o from objects o
left join object_attributes oa on o.id = oa.objectid left join object_attributes oa on o.uid = oa.object_uid
where o.type = $1 where o.type = $1
and o.posx >= $2 and o.posy >= $3 and o.posz >= $4 and o.posx >= $2 and o.posy >= $3 and o.posz >= $4
and o.posx <= $5 and o.posy <= $6 and o.posz <= $7 and o.posx <= $5 and o.posy <= $6 and o.posz <= $7
order by o.id order by o.uid
limit $8 limit $8
` `
const getMapDataWithAttributeLikePosQuery = ` const getMapDataWithAttributeLikePosQuery = `
select o.id, o.type, o.mtime, select o.uid, o.type, o.mtime,
o.x, o.y, o.z, o.x, o.y, o.z,
o.posx, o.posy, o.posz, o.posx, o.posy, o.posz,
oa.key, oa.value oa.key, oa.value
from objects o from objects o
left join object_attributes oa on o.id = oa.objectid left join object_attributes oa on o.uid = oa.object_uid
where o.id in ( where o.uid in (
select objectid from object_attributes where key = $8 and value ilike $9 select object_uid from object_attributes where key = $8 and value ilike $9
) )
and o.type = $1 and o.type = $1
and o.posx >= $2 and o.posy >= $3 and o.posz >= $4 and o.posx >= $2 and o.posy >= $3 and o.posz >= $4
and o.posx <= $5 and o.posy <= $6 and o.posz <= $7 and o.posx <= $5 and o.posy <= $6 and o.posz <= $7
order by o.id order by o.uid
limit $10 limit $10
` `
@ -36,14 +36,13 @@ delete from objects where posx = $1 and posy = $2 and posz = $3
const addMapDataQuery = ` const addMapDataQuery = `
insert into insert into
objects(x,y,z,posx,posy,posz,type,mtime) objects(uid, x,y,z,posx,posy,posz,type,mtime)
values($1, $2, $3, $4, $5, $6, $7, $8) values($1, $2, $3, $4, $5, $6, $7, $8, $9)
returning id
` `
const addMapDataAttributeQuery = ` const addMapDataAttributeQuery = `
insert into insert into
object_attributes(objectid, key, value) object_attributes(object_uid, key, value)
values($1, $2, $3) values($1, $2, $3)
` `

View File

@ -2,10 +2,11 @@ package sqlite
import ( import (
"database/sql" "database/sql"
"mapserver/coords"
"mapserver/mapobjectdb" "mapserver/mapobjectdb"
"mapserver/types"
"unicode/utf8" "unicode/utf8"
"github.com/google/uuid"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
@ -42,17 +43,17 @@ func (db *Sqlite3Accessor) GetMapData(q *mapobjectdb.SearchQuery) ([]*mapobjectd
result := make([]*mapobjectdb.MapObject, 0) result := make([]*mapobjectdb.MapObject, 0)
var currentObj *mapobjectdb.MapObject var currentObj *mapobjectdb.MapObject
var currentId *int64 var currentUID string
for rows.Next() { for rows.Next() {
var id int64 var uid string
var Type string var Type string
var mtime int64 var mtime int64
var x, y, z int var x, y, z int
var posx, posy, posz int var posx, posy, posz int
var key, value string var key, value string
err = rows.Scan(&id, &Type, &mtime, err = rows.Scan(&uid, &Type, &mtime,
&x, &y, &z, &posx, &posy, &posz, &x, &y, &z, &posx, &posy, &posz,
&key, &value, &key, &value,
) )
@ -61,8 +62,8 @@ func (db *Sqlite3Accessor) GetMapData(q *mapobjectdb.SearchQuery) ([]*mapobjectd
return nil, err return nil, err
} }
if currentId == nil || *currentId != id { if currentUID == "" || currentUID != uid {
pos := coords.NewMapBlockCoords(posx, posy, posz) pos := types.NewMapBlockCoords(posx, posy, posz)
mo := &mapobjectdb.MapObject{ mo := &mapobjectdb.MapObject{
MBPos: pos, MBPos: pos,
Type: Type, Type: Type,
@ -74,10 +75,9 @@ func (db *Sqlite3Accessor) GetMapData(q *mapobjectdb.SearchQuery) ([]*mapobjectd
} }
currentObj = mo currentObj = mo
currentId = &id currentUID = uid
result = append(result, currentObj) result = append(result, currentObj)
} }
currentObj.Attributes[key] = value currentObj.Attributes[key] = value
@ -86,8 +86,13 @@ func (db *Sqlite3Accessor) GetMapData(q *mapobjectdb.SearchQuery) ([]*mapobjectd
return result, nil return result, nil
} }
func (db *Sqlite3Accessor) RemoveMapData(pos *coords.MapBlockCoords) error { func (a *Sqlite3Accessor) RemoveMapData(pos *types.MapBlockCoords) error {
_, err := db.db.Exec(removeMapDataQuery, pos.X, pos.Y, pos.Z) _, err := a.db.Exec(removeMapDataAttributesQuery, pos.X, pos.Y, pos.Z)
if err != nil {
return err
}
_, err = a.db.Exec(removeMapDataQuery, pos.X, pos.Y, pos.Z)
return err return err
} }
@ -106,7 +111,9 @@ func (db *Sqlite3Accessor) AddMapData(data *mapobjectdb.MapObject) error {
} }
} }
res, err := db.db.Exec(addMapDataQuery, uid := uuid.NewString()
_, err := db.db.Exec(addMapDataQuery,
uid,
data.X, data.Y, data.Z, data.X, data.Y, data.Z,
data.MBPos.X, data.MBPos.Y, data.MBPos.Z, data.MBPos.X, data.MBPos.Y, data.MBPos.Z,
data.Type, data.Mtime) data.Type, data.Mtime)
@ -115,16 +122,8 @@ func (db *Sqlite3Accessor) AddMapData(data *mapobjectdb.MapObject) error {
return err return err
} }
id, err := res.LastInsertId()
if err != nil {
return err
}
for k, v := range data.Attributes { for k, v := range data.Attributes {
//TODO: batch insert _, err := db.db.Exec(addMapDataAttributeQuery, uid, k, v)
_, err := db.db.Exec(addMapDataAttributeQuery, id, k, v)
if err != nil { if err != nil {
return err return err
} }

Some files were not shown because too many files have changed in this diff Show More