Compare commits
35 commits
Author | SHA1 | Date | |
---|---|---|---|
asonix | 4717e4fdb2 | ||
asonix | 73002d4d35 | ||
asonix | a335225088 | ||
asonix | 0d9ec4cc87 | ||
asonix | 21ffc4111e | ||
asonix | a2abc146f4 | ||
asonix | 7b188e2fa1 | ||
asonix | 801747c7bc | ||
asonix | 39e2344fb2 | ||
asonix | d163a3cf79 | ||
asonix | c834b6c913 | ||
asonix | 74b011afe9 | ||
asonix | 4ccba45d58 | ||
asonix | 5db1dbc96c | ||
asonix | 2d5da08bad | ||
asonix | 17177cb6ea | ||
asonix | 26df437691 | ||
asonix | 64ea25c915 | ||
asonix | 203ffbbbaf | ||
asonix | 88aa177f7c | ||
asonix | afe081a099 | ||
asonix | 5b02cbec16 | ||
asonix | faec338d57 | ||
asonix | 909ce8af4c | ||
asonix | 58b48871b1 | ||
asonix | 50d41873cd | ||
asonix | e9510092c5 | ||
asonix | 78e4d834ed | ||
asonix | 71cb19ff83 | ||
asonix | 8a0e026fc5 | ||
asonix | 103a320898 | ||
asonix | 1a42a82e91 | ||
asonix | 047b5c27ee | ||
asonix | de0dd9580c | ||
asonix | 6a84b7cb7e |
61
.forgejo/workflows/check.yaml
Normal file
61
.forgejo/workflows/check.yaml
Normal file
|
@ -0,0 +1,61 @@
|
|||
on:
|
||||
push:
|
||||
branches:
|
||||
- '*'
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
clippy:
|
||||
runs-on: docker
|
||||
container:
|
||||
image: docker.io/asonix/actions-base-image:0.1
|
||||
steps:
|
||||
-
|
||||
name: Checkout warriors-names
|
||||
uses: https://github.com/actions/checkout@v4
|
||||
-
|
||||
name: Cargo Cache
|
||||
uses: https://git.asonix.dog/asonix/actions/cache-rust-dependencies@main
|
||||
-
|
||||
name: Clippy
|
||||
run: |
|
||||
cargo clippy --no-default-features -- -D warnings
|
||||
|
||||
tests:
|
||||
runs-on: docker
|
||||
container:
|
||||
image: docker.io/asonix/actions-base-image:0.1
|
||||
steps:
|
||||
-
|
||||
name: Checkout warriors-names
|
||||
uses: https://github.com/actions/checkout@v4
|
||||
-
|
||||
name: Cargo Cache
|
||||
uses: https://git.asonix.dog/asonix/actions/cache-rust-dependencies@main
|
||||
-
|
||||
name: Test
|
||||
run: cargo test
|
||||
|
||||
check:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target:
|
||||
- x86_64-unknown-linux-musl
|
||||
- armv7-unknown-linux-musleabihf
|
||||
- aarch64-unknown-linux-musl
|
||||
runs-on: docker
|
||||
container:
|
||||
image: docker.io/asonix/actions-base-image:0.1
|
||||
steps:
|
||||
-
|
||||
name: Checkout warriors-names
|
||||
uses: https://github.com/actions/checkout@v4
|
||||
-
|
||||
name: Cargo Cache
|
||||
uses: https://git.asonix.dog/asonix/actions/cache-rust-dependencies@main
|
||||
-
|
||||
name: Debug builds
|
||||
run: cargo zigbuild --target ${{ matrix.target }}
|
225
.forgejo/workflows/publish.yaml
Normal file
225
.forgejo/workflows/publish.yaml
Normal file
|
@ -0,0 +1,225 @@
|
|||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v*.*.*'
|
||||
|
||||
env:
|
||||
REGISTRY_IMAGE: asonix/warriors-names
|
||||
|
||||
jobs:
|
||||
clippy:
|
||||
runs-on: base-image
|
||||
container:
|
||||
image: docker.io/asonix/actions-base-image:0.1
|
||||
steps:
|
||||
-
|
||||
name: Checkout warriors-names
|
||||
uses: https://github.com/actions/checkout@v4
|
||||
-
|
||||
name: Cargo Cache
|
||||
uses: https://git.asonix.dog/asonix/actions/cache-rust-dependencies@main
|
||||
-
|
||||
name: Clippy
|
||||
run: |
|
||||
cargo clippy --no-default-features -- -D warnings
|
||||
|
||||
tests:
|
||||
runs-on: docker
|
||||
container:
|
||||
image: docker.io/asonix/actions-base-image:0.1
|
||||
steps:
|
||||
-
|
||||
name: Checkout warriors-names
|
||||
uses: https://github.com/actions/checkout@v4
|
||||
-
|
||||
name: Cargo Cache
|
||||
uses: https://git.asonix.dog/asonix/actions/cache-rust-dependencies@main
|
||||
-
|
||||
name: Test
|
||||
run: cargo test
|
||||
|
||||
build:
|
||||
needs:
|
||||
- clippy
|
||||
- tests
|
||||
runs-on: docker
|
||||
container:
|
||||
image: docker.io/asonix/actions-base-image:0.1
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
info:
|
||||
- target: x86_64-unknown-linux-musl
|
||||
artifact: linux-amd64
|
||||
platform: linux/amd64
|
||||
- target: armv7-unknown-linux-musleabihf
|
||||
artifact: linux-arm32v7
|
||||
platform: linux/arm/v7
|
||||
- target: aarch64-unknown-linux-musl
|
||||
artifact: linux-arm64v8
|
||||
platform: linux/arm64
|
||||
steps:
|
||||
-
|
||||
name: Checkout warriors-names
|
||||
uses: https://github.com/actions/checkout@v4
|
||||
-
|
||||
name: Cargo Cache
|
||||
uses: https://git.asonix.dog/asonix/actions/cache-rust-dependencies@main
|
||||
-
|
||||
name: Prepare Platform
|
||||
run: |
|
||||
platform=${{ matrix.info.platform }}
|
||||
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
|
||||
shell: bash
|
||||
-
|
||||
name: Docker meta
|
||||
id: meta
|
||||
uses: https://github.com/docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env.REGISTRY_IMAGE }}
|
||||
flavor: |
|
||||
latest=auto
|
||||
suffix=-${{ matrix.info.artifact }}
|
||||
tags: |
|
||||
type=raw,value=latest,enable={{ is_default_branch }}
|
||||
type=semver,pattern={{version}}
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
type=semver,pattern={{major}}
|
||||
-
|
||||
name: Set up QEMU
|
||||
uses: https://github.com/docker/setup-qemu-action@v3
|
||||
-
|
||||
name: Set up Docker Buildx
|
||||
uses: https://github.com/docker/setup-buildx-action@v3
|
||||
-
|
||||
name: Docker login
|
||||
uses: https://github.com/docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
-
|
||||
name: Compile warriors-names
|
||||
run: cargo zigbuild --target ${{ matrix.info.target }} --release
|
||||
-
|
||||
name: Prepare artifacts
|
||||
run: |
|
||||
mkdir artifacts
|
||||
cp target/${{ matrix.info.target }}/release/warriors-names artifacts/warriors-names-${{ matrix.info.artifact }}
|
||||
-
|
||||
uses: https://github.com/actions/upload-artifact@v3
|
||||
with:
|
||||
name: binaries
|
||||
path: artifacts/
|
||||
-
|
||||
name: Prepare binary
|
||||
run: |
|
||||
cp target/${{ matrix.info.target }}/release/warriors-names docker/forgejo/warriors-names
|
||||
-
|
||||
name: Build and push ${{ matrix.info.platform }} docker image
|
||||
id: build
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: ./docker/forgejo
|
||||
platforms: ${{ matrix.info.platform }}
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
outputs: type=image,name=${{ env.REGISTRY_IMAGE }},name-canonical=true,push=true
|
||||
-
|
||||
name: Export digest
|
||||
run: |
|
||||
mkdir -p /tmp/digests
|
||||
digest="${{ steps.build.outputs.digest }}"
|
||||
touch "/tmp/digests/${digest#sha256:}"
|
||||
echo "Created /tmp/digests/${digest#sha256:}"
|
||||
shell: bash
|
||||
-
|
||||
name: Upload ${{ matrix.info.platform }} digest
|
||||
uses: https://github.com/actions/upload-artifact@v3
|
||||
with:
|
||||
name: digests
|
||||
path: /tmp/digests/*
|
||||
if-no-files-found: error
|
||||
retention-days: 1
|
||||
|
||||
publish-docker:
|
||||
runs-on: docker
|
||||
container:
|
||||
image: docker.io/asonix/actions-base-image:0.1
|
||||
needs: [build]
|
||||
steps:
|
||||
-
|
||||
name: Download digests
|
||||
uses: https://github.com/actions/download-artifact@v3
|
||||
with:
|
||||
name: digests
|
||||
path: /tmp/digests
|
||||
pattern: digests-*
|
||||
merge-multiple: true
|
||||
-
|
||||
name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
-
|
||||
name: Docker login
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
-
|
||||
name: Docker meta
|
||||
id: meta
|
||||
uses: https://github.com/docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env.REGISTRY_IMAGE }}
|
||||
flavor: |
|
||||
latest=auto
|
||||
tags: |
|
||||
type=raw,value=latest,enable={{ is_default_branch }}
|
||||
type=semver,pattern={{version}}
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
type=semver,pattern={{major}}
|
||||
-
|
||||
name: Create manifest list and push
|
||||
working-directory: /tmp/digests
|
||||
run: |
|
||||
tags=$(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "${DOCKER_METADATA_OUTPUT_JSON}")
|
||||
images=$(printf "${{ env.REGISTRY_IMAGE }}@sha256:%s " *)
|
||||
echo "Running 'docker buildx imagetools create ${tags[@]} ${images[@]}'"
|
||||
docker buildx imagetools create ${tags[@]} ${images[@]}
|
||||
shell: bash
|
||||
-
|
||||
name: Inspect Image
|
||||
run: |
|
||||
docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }}
|
||||
|
||||
publish-forgejo:
|
||||
needs: [build]
|
||||
runs-on: docker
|
||||
container:
|
||||
image: docker.io/asonix/actions-base-image:0.1
|
||||
steps:
|
||||
- uses: https://github.com/actions/download-artifact@v3
|
||||
with:
|
||||
name: binaries
|
||||
path: artifacts/
|
||||
merge-multiple: true
|
||||
- uses: actions/forgejo-release@v1
|
||||
with:
|
||||
direction: upload
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
release-dir: artifacts/
|
||||
|
||||
publish-crate:
|
||||
needs: [build]
|
||||
runs-on: docker
|
||||
container:
|
||||
image: docker.io/asonix/actions-base-image:0.1
|
||||
steps:
|
||||
-
|
||||
name: Checkout warriors-names
|
||||
uses: https://github.com/actions/checkout@v4
|
||||
-
|
||||
name: Cargo Cache
|
||||
uses: https://git.asonix.dog/asonix/actions/cache-rust-dependencies@main
|
||||
-
|
||||
name: Publish Crate
|
||||
run: cargo publish --token ${{ secrets.CRATES_IO_TOKEN }}
|
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -1,3 +1,6 @@
|
|||
/target
|
||||
Token.toml
|
||||
Config.toml
|
||||
.envrc
|
||||
.direnv
|
||||
result
|
||||
|
|
1016
Cargo.lock
generated
1016
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
22
Cargo.toml
22
Cargo.toml
|
@ -1,17 +1,25 @@
|
|||
[package]
|
||||
name = "warriors-names"
|
||||
version = "0.1.1"
|
||||
description = "A bot that generates warriors cat names and posts them to mastodon"
|
||||
version = "0.2.3"
|
||||
authors = ["asonix <asonix@asonix.dog>"]
|
||||
edition = "2018"
|
||||
license = "AGPL-3.0"
|
||||
repository = "https://git.asonix.dog/asonix/warriors-names"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
[profile.release]
|
||||
strip = true
|
||||
|
||||
[dependencies]
|
||||
anyhow = "1.0"
|
||||
rand = "0.7"
|
||||
reqwest = { version = "0.10", default-features = false, features = ["json", "rustls-tls"] }
|
||||
rand = "0.8"
|
||||
reqwest = { version = "0.11", default-features = false, features = [
|
||||
"json",
|
||||
"rustls-tls",
|
||||
] }
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
toml = "0.5"
|
||||
tokio = { version = "0.3", features = ["full"] }
|
||||
tokio-compat-02 = "0.1"
|
||||
serde_json = "1.0"
|
||||
toml = "0.8"
|
||||
tokio = { version = "1", features = ["full"] }
|
||||
url = { version = "2.0", features = ["serde"] }
|
||||
|
|
|
@ -1,131 +1,3 @@
|
|||
[names]
|
||||
prefix = [
|
||||
"feather",
|
||||
"crow",
|
||||
"bramble",
|
||||
"hawk",
|
||||
"fire",
|
||||
"red",
|
||||
"lion",
|
||||
"misty",
|
||||
"tawny",
|
||||
"gray",
|
||||
"running",
|
||||
"golden",
|
||||
"owl",
|
||||
"rabbit",
|
||||
"spider",
|
||||
"leaf",
|
||||
"squirrel",
|
||||
"oak",
|
||||
"storm",
|
||||
"stone",
|
||||
"sand",
|
||||
"dark",
|
||||
"long",
|
||||
"one",
|
||||
"half",
|
||||
"holly",
|
||||
"black",
|
||||
"brindle",
|
||||
"leopard",
|
||||
"tiger",
|
||||
"moth",
|
||||
"spotted",
|
||||
"raven",
|
||||
"sorrel",
|
||||
"cloud",
|
||||
"bright",
|
||||
"lost",
|
||||
"cedar",
|
||||
"ginger",
|
||||
"blue",
|
||||
"white",
|
||||
"willow",
|
||||
"mouse",
|
||||
"dust",
|
||||
"frost",
|
||||
"speckle",
|
||||
"small",
|
||||
"patch",
|
||||
"dapple",
|
||||
"broken",
|
||||
"stumpy",
|
||||
"brown",
|
||||
"wet",
|
||||
"claw",
|
||||
"little",
|
||||
"night",
|
||||
"dawn",
|
||||
"ash",
|
||||
"tall",
|
||||
"crooked",
|
||||
"yellow",
|
||||
"cinder",
|
||||
"bracken",
|
||||
"dead",
|
||||
"bark",
|
||||
"torn",
|
||||
"morning",
|
||||
"mud",
|
||||
"shade",
|
||||
"loud",
|
||||
"silver",
|
||||
"swift",
|
||||
"thorn",
|
||||
"heavy",
|
||||
"fern",
|
||||
"rowan",
|
||||
"gorse",
|
||||
"moss",
|
||||
"russet",
|
||||
"jagged",
|
||||
"rain",
|
||||
"soot",
|
||||
"shrew",
|
||||
"talon",
|
||||
"weasel",
|
||||
"robin",
|
||||
"thistle",
|
||||
"vole",
|
||||
"swallow",
|
||||
"splash",
|
||||
"smoke",
|
||||
]
|
||||
suffix = [
|
||||
"kit",
|
||||
"paw",
|
||||
"star",
|
||||
"leaf",
|
||||
"tail",
|
||||
"heart",
|
||||
"claw",
|
||||
"storm",
|
||||
"stripe",
|
||||
"wind",
|
||||
"pelt",
|
||||
"fur",
|
||||
"face",
|
||||
"flower",
|
||||
"ear",
|
||||
"eye",
|
||||
"foot",
|
||||
"nose",
|
||||
"cloud",
|
||||
"fang",
|
||||
"poppy",
|
||||
"whisker",
|
||||
"belly",
|
||||
"stream",
|
||||
"pool",
|
||||
"throat",
|
||||
"brook",
|
||||
"tooth",
|
||||
"step",
|
||||
"frost",
|
||||
"wing",
|
||||
]
|
||||
|
||||
[timing]
|
||||
duration = 360
|
||||
|
||||
|
|
336
Description.json
Normal file
336
Description.json
Normal file
|
@ -0,0 +1,336 @@
|
|||
{
|
||||
"root": "pelt",
|
||||
"entries": [{
|
||||
"name": "descriptor",
|
||||
"variants": [
|
||||
"sleek",
|
||||
"large",
|
||||
"small",
|
||||
"swift",
|
||||
"skinny",
|
||||
"thin",
|
||||
"young",
|
||||
"old",
|
||||
"long-legged",
|
||||
"long-haired",
|
||||
"long-tailed",
|
||||
"huge",
|
||||
"massive",
|
||||
"battle-scarred",
|
||||
"pretty",
|
||||
"handsome",
|
||||
"beautiful",
|
||||
"mottled"
|
||||
],
|
||||
"next": [{
|
||||
"from": [
|
||||
"massive",
|
||||
"huge",
|
||||
"large"
|
||||
],
|
||||
"to": [
|
||||
"long-legged",
|
||||
"long-haired",
|
||||
"old",
|
||||
"young",
|
||||
"long-tailed",
|
||||
"battle-scarred",
|
||||
"handsome",
|
||||
"pretty",
|
||||
"beautiful",
|
||||
"mottled"
|
||||
],
|
||||
"chance": 0.5,
|
||||
"join": ", "
|
||||
}, {
|
||||
"from": ["small"],
|
||||
"to": [
|
||||
"sleek",
|
||||
"swift",
|
||||
"skinny",
|
||||
"thin",
|
||||
"old",
|
||||
"young",
|
||||
"long-haired",
|
||||
"battle-scarred",
|
||||
"handsome",
|
||||
"pretty",
|
||||
"beautiful",
|
||||
"mottled"
|
||||
],
|
||||
"chance": 0.5,
|
||||
"join": ", "
|
||||
}, {
|
||||
"from": [
|
||||
"handsome",
|
||||
"pretty",
|
||||
"beautiful"
|
||||
],
|
||||
"to": [
|
||||
"old",
|
||||
"young"
|
||||
],
|
||||
"chance": 0.5,
|
||||
"join": ", "
|
||||
}]
|
||||
}, {
|
||||
"name": "eye-color",
|
||||
"variants": [
|
||||
"blue",
|
||||
"amber",
|
||||
"green",
|
||||
"brown"
|
||||
],
|
||||
"depends": [{
|
||||
"variants": "any",
|
||||
"depends": "color-modifier",
|
||||
"chance": 0.3,
|
||||
"order": "{color-modifier} {base}",
|
||||
"weights": [
|
||||
[1, "light"],
|
||||
[1, "dark"],
|
||||
[1, "pale"],
|
||||
[1, "bright"]
|
||||
]
|
||||
}]
|
||||
}, {
|
||||
"name": "post-descriptor",
|
||||
"variants": [
|
||||
"long claws",
|
||||
"a twisted paw",
|
||||
"eyes",
|
||||
"paws",
|
||||
"stripes",
|
||||
"spots",
|
||||
"splotches"
|
||||
],
|
||||
"depends": [{
|
||||
"variants": ["eyes"],
|
||||
"depends": "eye-color",
|
||||
"chance": 1,
|
||||
"order": "{eye-color} {base}"
|
||||
}, {
|
||||
"variants": [
|
||||
"paws",
|
||||
"stripes",
|
||||
"spots",
|
||||
"splotches"
|
||||
],
|
||||
"depends": "pelt-color",
|
||||
"chance": 1,
|
||||
"order": "{pelt-color} {base}"
|
||||
}],
|
||||
"next": [{
|
||||
"from": "any",
|
||||
"to": "any",
|
||||
"chance": 0.4,
|
||||
"join": " and "
|
||||
}]
|
||||
}, {
|
||||
"name": "solid",
|
||||
"variants": ["solid"]
|
||||
}, {
|
||||
"name": "very",
|
||||
"variants": ["very"]
|
||||
}, {
|
||||
"name": "color-modifier",
|
||||
"variants": [
|
||||
"dark",
|
||||
"light",
|
||||
"pale",
|
||||
"bright",
|
||||
"jet"
|
||||
],
|
||||
"depends": [{
|
||||
"variants": [
|
||||
"light",
|
||||
"pale",
|
||||
"dark",
|
||||
"bright"
|
||||
],
|
||||
"depends": "very",
|
||||
"chance": 0.2,
|
||||
"order": "{very} {base}"
|
||||
}]
|
||||
}, {
|
||||
"name": "pelt-color",
|
||||
"variants": [
|
||||
"black",
|
||||
"black-and-white",
|
||||
"black-and-gray",
|
||||
"gray",
|
||||
"gray-and-white",
|
||||
"silver",
|
||||
"blue-gray",
|
||||
"ginger",
|
||||
"brown",
|
||||
"reddish-brown",
|
||||
"golden",
|
||||
"golden-brown",
|
||||
"dusky-brown",
|
||||
"white"
|
||||
],
|
||||
"depends": [{
|
||||
"variants": ["black"],
|
||||
"depends": "color-modifier",
|
||||
"chance": 0.3,
|
||||
"order": "{color-modifier} {base}",
|
||||
"weights": [
|
||||
[1, "dark"],
|
||||
[2, "jet"]
|
||||
]
|
||||
}, {
|
||||
"variants": [
|
||||
"gray",
|
||||
"silver",
|
||||
"blue-gray",
|
||||
"ginger",
|
||||
"brown",
|
||||
"reddish-brown",
|
||||
"golden",
|
||||
"golden-brown"
|
||||
],
|
||||
"depends": "color-modifier",
|
||||
"chance": 0.3,
|
||||
"order": "{color-modifier} {base}",
|
||||
"weights": [
|
||||
[1, "dark"],
|
||||
[1, "light"],
|
||||
[1, "pale"],
|
||||
[1, "bright"]
|
||||
]
|
||||
}, {
|
||||
"variants": ["white"],
|
||||
"depends": "color-modifier",
|
||||
"chance": 0.3,
|
||||
"order": "{color-modifier} {base}",
|
||||
"weights": [
|
||||
[1, "bright"]
|
||||
]
|
||||
}, {
|
||||
"variants": [
|
||||
"black",
|
||||
"gray",
|
||||
"silver",
|
||||
"blue-gray",
|
||||
"ginger",
|
||||
"brown",
|
||||
"reddish-brown",
|
||||
"golden",
|
||||
"golden-brown",
|
||||
"dusky-brown",
|
||||
"white"
|
||||
],
|
||||
"depends": "solid",
|
||||
"chance": 0.2,
|
||||
"order": "{solid} {base}"
|
||||
}]
|
||||
}, {
|
||||
"name": "gembder",
|
||||
"variants": [
|
||||
"she-cat",
|
||||
"queen",
|
||||
"tom"
|
||||
]
|
||||
}, {
|
||||
"name": "pelt",
|
||||
"variants": [
|
||||
"tortoiseshell",
|
||||
"tabby",
|
||||
"cat"
|
||||
],
|
||||
"silent": ["cat"],
|
||||
"depends": [{
|
||||
"variants": [
|
||||
"tortoiseshell",
|
||||
"tabby"
|
||||
],
|
||||
"depends": "pelt-color",
|
||||
"forbids": [{
|
||||
"name": "solid",
|
||||
"variants": ["solid"]
|
||||
}],
|
||||
"chance": 0.5,
|
||||
"order": "{pelt-color} {base}"
|
||||
}, {
|
||||
"variants": ["cat"],
|
||||
"depends": "pelt-color",
|
||||
"chance": 1,
|
||||
"order": "{pelt-color} {base}"
|
||||
}, {
|
||||
"variants": ["tortoiseshell"],
|
||||
"depends": "gembder",
|
||||
"chance": 0.5,
|
||||
"order": "{base} {gembder}",
|
||||
"weights": [
|
||||
[80, "she-cat"],
|
||||
[20, "queen"],
|
||||
[1, "tom"]
|
||||
]
|
||||
}, {
|
||||
"variants": ["tabby"],
|
||||
"depends": "gembder",
|
||||
"chance": 0.5,
|
||||
"order": "{base} {gembder}"
|
||||
}, {
|
||||
"variants": ["cat"],
|
||||
"depends": "gembder",
|
||||
"chance": 0.5,
|
||||
"order": "{base} {gembder}",
|
||||
"default": "cat"
|
||||
}, {
|
||||
"variants": [
|
||||
"tabby",
|
||||
"tortoiseshell"
|
||||
],
|
||||
"depends": "descriptor",
|
||||
"forbids": [{
|
||||
"name": "descriptor",
|
||||
"variants": ["mottled"]
|
||||
}],
|
||||
"chance": 0.5,
|
||||
"order": "{descriptor} {base}"
|
||||
}, {
|
||||
"variants": ["cat"],
|
||||
"depends": "descriptor",
|
||||
"chance": 0.5,
|
||||
"order": "{descriptor} {base}"
|
||||
}, {
|
||||
"variants": ["tabby"],
|
||||
"depends": "post-descriptor",
|
||||
"chance": 0.5,
|
||||
"order": "{base} with {post-descriptor}",
|
||||
"weights": [
|
||||
[2, "long claws"],
|
||||
[1, "a twisted paw"],
|
||||
[4, "eyes"],
|
||||
[3, "paws"],
|
||||
[2, "stripes"]
|
||||
]
|
||||
}, {
|
||||
"variants": ["tortoiseshell"],
|
||||
"depends": "post-descriptor",
|
||||
"chance": 0.5,
|
||||
"order": "{base} with {post-descriptor}",
|
||||
"weights": [
|
||||
[2, "long claws"],
|
||||
[1, "a twisted paw"],
|
||||
[4, "eyes"],
|
||||
[3, "paws"],
|
||||
[2, "splotches"]
|
||||
]
|
||||
}, {
|
||||
"variants": ["cat"],
|
||||
"depends": "post-descriptor",
|
||||
"chance": 0.5,
|
||||
"order": "{base} with {post-descriptor}",
|
||||
"weights": [
|
||||
[2, "long claws"],
|
||||
[1, "a twisted paw"],
|
||||
[4, "eyes"],
|
||||
[3, "paws"],
|
||||
[2, "spots"]
|
||||
]
|
||||
}]
|
||||
}]
|
||||
}
|
230
Name.json
Normal file
230
Name.json
Normal file
|
@ -0,0 +1,230 @@
|
|||
{
|
||||
"prefix": [
|
||||
"feather",
|
||||
"crow",
|
||||
"bramble",
|
||||
"hawk",
|
||||
"fire",
|
||||
"red",
|
||||
"lion",
|
||||
"misty",
|
||||
"tawny",
|
||||
"gray",
|
||||
"running",
|
||||
"golden",
|
||||
"owl",
|
||||
"rabbit",
|
||||
"spider",
|
||||
"leaf",
|
||||
"squirrel",
|
||||
"oak",
|
||||
"storm",
|
||||
"stone",
|
||||
"sand",
|
||||
"dark",
|
||||
"long",
|
||||
"one",
|
||||
"half",
|
||||
"holly",
|
||||
"black",
|
||||
"brindle",
|
||||
"leopard",
|
||||
"tiger",
|
||||
"moth",
|
||||
"spotted",
|
||||
"raven",
|
||||
"sorrel",
|
||||
"cloud",
|
||||
"bright",
|
||||
"lost",
|
||||
"cedar",
|
||||
"ginger",
|
||||
"blue",
|
||||
"white",
|
||||
"willow",
|
||||
"mouse",
|
||||
"dust",
|
||||
"frost",
|
||||
"speckle",
|
||||
"small",
|
||||
"patch",
|
||||
"dapple",
|
||||
"broken",
|
||||
"stumpy",
|
||||
"brown",
|
||||
"wet",
|
||||
"claw",
|
||||
"little",
|
||||
"night",
|
||||
"dawn",
|
||||
"ash",
|
||||
"tall",
|
||||
"crooked",
|
||||
"yellow",
|
||||
"cinder",
|
||||
"bracken",
|
||||
"dead",
|
||||
"bark",
|
||||
"torn",
|
||||
"morning",
|
||||
"mud",
|
||||
"shade",
|
||||
"loud",
|
||||
"silver",
|
||||
"swift",
|
||||
"thorn",
|
||||
"heavy",
|
||||
"fern",
|
||||
"rowan",
|
||||
"gorse",
|
||||
"moss",
|
||||
"russet",
|
||||
"jagged",
|
||||
"rain",
|
||||
"soot",
|
||||
"shrew",
|
||||
"talon",
|
||||
"weasel",
|
||||
"robin",
|
||||
"thistle",
|
||||
"vole",
|
||||
"swallow",
|
||||
"splash",
|
||||
"smoke",
|
||||
"birch",
|
||||
"larch",
|
||||
"berry",
|
||||
"hazel",
|
||||
"web",
|
||||
"rush",
|
||||
"beech",
|
||||
"reed",
|
||||
"mole",
|
||||
"honey",
|
||||
"poppy",
|
||||
"ivy",
|
||||
"snow",
|
||||
"kestrel",
|
||||
"hare",
|
||||
"breeze",
|
||||
"minnow",
|
||||
"pounce",
|
||||
"pebble",
|
||||
"ripple",
|
||||
"ice",
|
||||
"fox",
|
||||
"dove",
|
||||
"kink",
|
||||
"flame",
|
||||
"olive",
|
||||
"snake",
|
||||
"scorch",
|
||||
"sedge",
|
||||
"ember",
|
||||
"dew",
|
||||
"ant",
|
||||
"heather",
|
||||
"mallow",
|
||||
"mint",
|
||||
"nettle",
|
||||
"sneeze",
|
||||
"otter",
|
||||
"pine",
|
||||
"blossom",
|
||||
"bumble",
|
||||
"briar",
|
||||
"rose",
|
||||
"ferret",
|
||||
"apple",
|
||||
"rat",
|
||||
"starling",
|
||||
"whisker",
|
||||
"furze",
|
||||
"boulder",
|
||||
"sun",
|
||||
"mossy",
|
||||
"beetle",
|
||||
"petal",
|
||||
"grass",
|
||||
"hollow",
|
||||
"dusk",
|
||||
"sky",
|
||||
"sharp",
|
||||
"short",
|
||||
"clover",
|
||||
"echo",
|
||||
"cherry",
|
||||
"sparrow",
|
||||
"rock",
|
||||
"sage",
|
||||
"bounce",
|
||||
"tiny",
|
||||
"buzzard",
|
||||
"seed",
|
||||
"milk",
|
||||
"lark",
|
||||
"sloe",
|
||||
"wasp",
|
||||
"ebony",
|
||||
"freckle",
|
||||
"billy",
|
||||
"snook",
|
||||
"fallow",
|
||||
"lichen",
|
||||
"fawn"
|
||||
],
|
||||
"suffix": [
|
||||
"kit",
|
||||
"paw",
|
||||
"star",
|
||||
"leaf",
|
||||
"tail",
|
||||
"heart",
|
||||
"claw",
|
||||
"storm",
|
||||
"stripe",
|
||||
"wind",
|
||||
"pelt",
|
||||
"fur",
|
||||
"face",
|
||||
"flower",
|
||||
"ear",
|
||||
"eye",
|
||||
"foot",
|
||||
"nose",
|
||||
"cloud",
|
||||
"fang",
|
||||
"poppy",
|
||||
"whisker",
|
||||
"belly",
|
||||
"stream",
|
||||
"pool",
|
||||
"throat",
|
||||
"brook",
|
||||
"tooth",
|
||||
"step",
|
||||
"frost",
|
||||
"wing",
|
||||
"fall",
|
||||
"bird",
|
||||
"feather",
|
||||
"mist",
|
||||
"blaze",
|
||||
"water",
|
||||
"spots",
|
||||
"shine",
|
||||
"leap",
|
||||
"petal",
|
||||
"scar",
|
||||
"strike",
|
||||
"trout",
|
||||
"willow",
|
||||
"light",
|
||||
"flight",
|
||||
"watcher",
|
||||
"dapple",
|
||||
"fire",
|
||||
"fern"
|
||||
]
|
||||
}
|
||||
|
23
docker/forgejo/Dockerfile
Normal file
23
docker/forgejo/Dockerfile
Normal file
|
@ -0,0 +1,23 @@
|
|||
FROM alpine:3.19
|
||||
|
||||
ARG UID=991
|
||||
ARG GID=991
|
||||
|
||||
ENV \
|
||||
UID=${UID} \
|
||||
GID=${GID}
|
||||
|
||||
USER root
|
||||
RUN \
|
||||
addgroup -g "${GID}" app && \
|
||||
adduser -D -G app -u "${UID}" -g "" -h /opt/app app && \
|
||||
apk add tini && \
|
||||
chown -R app:app /mnt
|
||||
|
||||
COPY warriors-names /usr/local/bin/warriors-names
|
||||
|
||||
USER app
|
||||
VOLUME /mnt
|
||||
WORKDIR /mnt
|
||||
ENTRYPOINT ["/sbin/tini", "--"]
|
||||
CMD ["/usr/local/bin/warriors-names"]
|
|
@ -1,74 +0,0 @@
|
|||
FROM rustembedded/cross:x86_64-unknown-linux-musl AS x86_64-builder
|
||||
|
||||
ARG UID=991
|
||||
ARG GID=991
|
||||
|
||||
ENV TOOLCHAIN=stable
|
||||
ENV TARGET=x86_64-unknown-linux-musl
|
||||
ENV TOOL=x86_64-linux-musl
|
||||
|
||||
RUN \
|
||||
apt-get update && \
|
||||
apt-get upgrade -y
|
||||
|
||||
RUN \
|
||||
addgroup --gid "${GID}" build && \
|
||||
adduser \
|
||||
--disabled-password \
|
||||
--gecos "" \
|
||||
--ingroup build \
|
||||
--uid "${UID}" \
|
||||
--home /opt/build \
|
||||
build
|
||||
|
||||
ADD https://sh.rustup.rs /opt/build/rustup.sh
|
||||
|
||||
RUN \
|
||||
chown -R build:build /opt/build
|
||||
|
||||
USER build
|
||||
WORKDIR /opt/build
|
||||
|
||||
ENV PATH=/opt/build/.cargo/bin:/usr/local/musl/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
|
||||
RUN \
|
||||
chmod +x rustup.sh && \
|
||||
./rustup.sh --default-toolchain $TOOLCHAIN --profile minimal -y && \
|
||||
rustup target add $TARGET
|
||||
|
||||
FROM x86_64-builder as builder
|
||||
|
||||
ARG TAG=main
|
||||
ARG REPOSITORY=https://git.asonix.dog/asonix/warriors-names
|
||||
ARG BINARY=warriors-names
|
||||
|
||||
RUN \
|
||||
git clone -b $TAG $REPOSITORY repo
|
||||
|
||||
WORKDIR /opt/build/repo
|
||||
|
||||
RUN \
|
||||
cargo build --release --target $TARGET && \
|
||||
$TOOL-strip target/$TARGET/release/$BINARY
|
||||
|
||||
FROM amd64/alpine:3.11
|
||||
|
||||
ARG UID=991
|
||||
ARG GID=991
|
||||
ARG BINARY=warriors-names
|
||||
|
||||
COPY --from=builder /opt/build/repo/target/x86_64-unknown-linux-musl/release/$BINARY /usr/bin/$BINARY
|
||||
|
||||
RUN \
|
||||
apk add tini && \
|
||||
addgroup -g $GID warriors && \
|
||||
adduser -D -G warriors -u $UID -g "" -h /opt/warriors warriors
|
||||
|
||||
RUN \
|
||||
chown -R warriors:warriors /mnt
|
||||
|
||||
VOLUME /mnt
|
||||
WORKDIR /opt/warriors
|
||||
USER warriors
|
||||
ENTRYPOINT ["/sbin/tini", "--"]
|
||||
CMD ["/usr/bin/warriors-names"]
|
|
@ -1,74 +0,0 @@
|
|||
FROM rustembedded/cross:arm-unknown-linux-musleabihf AS arm32v7-builder
|
||||
|
||||
ARG UID=991
|
||||
ARG GID=991
|
||||
|
||||
ENV TOOLCHAIN=stable
|
||||
ENV TARGET=arm-unknown-linux-musleabihf
|
||||
ENV TOOL=arm-linux-musleabihf
|
||||
|
||||
RUN \
|
||||
apt-get update && \
|
||||
apt-get upgrade -y
|
||||
|
||||
RUN \
|
||||
addgroup --gid "${GID}" build && \
|
||||
adduser \
|
||||
--disabled-password \
|
||||
--gecos "" \
|
||||
--ingroup build \
|
||||
--uid "${UID}" \
|
||||
--home /opt/build \
|
||||
build
|
||||
|
||||
ADD https://sh.rustup.rs /opt/build/rustup.sh
|
||||
|
||||
RUN \
|
||||
chown -R build:build /opt/build
|
||||
|
||||
USER build
|
||||
WORKDIR /opt/build
|
||||
|
||||
ENV PATH=/opt/build/.cargo/bin:/usr/local/musl/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
|
||||
RUN \
|
||||
chmod +x rustup.sh && \
|
||||
./rustup.sh --default-toolchain $TOOLCHAIN --profile minimal -y && \
|
||||
rustup target add $TARGET
|
||||
|
||||
FROM arm32v7-builder as builder
|
||||
|
||||
ARG TAG=main
|
||||
ARG REPOSITORY=https://git.asonix.dog/asonix/warriors-names
|
||||
ARG BINARY=warriors-names
|
||||
|
||||
RUN \
|
||||
git clone -b $TAG $REPOSITORY repo
|
||||
|
||||
WORKDIR /opt/build/repo
|
||||
|
||||
RUN \
|
||||
cargo build --release --target $TARGET && \
|
||||
$TOOL-strip target/$TARGET/release/$BINARY
|
||||
|
||||
FROM arm32v7/alpine:3.11
|
||||
|
||||
ARG UID=991
|
||||
ARG GID=991
|
||||
ARG BINARY=warriors-names
|
||||
|
||||
COPY --from=builder /opt/build/repo/target/arm-unknown-linux-musleabihf/release/$BINARY /usr/bin/$BINARY
|
||||
|
||||
RUN \
|
||||
apk add tini && \
|
||||
addgroup -g $GID warriors && \
|
||||
adduser -D -G warriors -u $UID -g "" -h /opt/warriors warriors
|
||||
|
||||
RUN \
|
||||
chown -R warriors:warriors /mnt
|
||||
|
||||
VOLUME /mnt
|
||||
WORKDIR /opt/warriors
|
||||
USER warriors
|
||||
ENTRYPOINT ["/sbin/tini", "--"]
|
||||
CMD ["/usr/bin/warriors-names"]
|
|
@ -1,74 +0,0 @@
|
|||
FROM rustembedded/cross:aarch64-unknown-linux-musl AS aarch64-builder
|
||||
|
||||
ARG UID=991
|
||||
ARG GID=991
|
||||
|
||||
ENV TOOLCHAIN=stable
|
||||
ENV TARGET=aarch64-unknown-linux-musl
|
||||
ENV TOOL=aarch64-linux-musl
|
||||
|
||||
RUN \
|
||||
apt-get update && \
|
||||
apt-get upgrade -y
|
||||
|
||||
RUN \
|
||||
addgroup --gid "${GID}" build && \
|
||||
adduser \
|
||||
--disabled-password \
|
||||
--gecos "" \
|
||||
--ingroup build \
|
||||
--uid "${UID}" \
|
||||
--home /opt/build \
|
||||
build
|
||||
|
||||
ADD https://sh.rustup.rs /opt/build/rustup.sh
|
||||
|
||||
RUN \
|
||||
chown -R build:build /opt/build
|
||||
|
||||
USER build
|
||||
WORKDIR /opt/build
|
||||
|
||||
ENV PATH=/opt/build/.cargo/bin:/usr/local/musl/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
|
||||
RUN \
|
||||
chmod +x rustup.sh && \
|
||||
./rustup.sh --default-toolchain $TOOLCHAIN --profile minimal -y && \
|
||||
rustup target add $TARGET
|
||||
|
||||
FROM aarch64-builder as builder
|
||||
|
||||
ARG TAG=main
|
||||
ARG REPOSITORY=https://git.asonix.dog/asonix/warriors-names
|
||||
ARG BINARY=warriors-names
|
||||
|
||||
RUN \
|
||||
git clone -b $TAG $REPOSITORY repo
|
||||
|
||||
WORKDIR /opt/build/repo
|
||||
|
||||
RUN \
|
||||
cargo build --release --target $TARGET && \
|
||||
$TOOL-strip target/$TARGET/release/$BINARY
|
||||
|
||||
FROM arm64v8/alpine:3.11
|
||||
|
||||
ARG UID=991
|
||||
ARG GID=991
|
||||
ARG BINARY=warriors-names
|
||||
|
||||
COPY --from=builder /opt/build/repo/target/aarch64-unknown-linux-musl/release/$BINARY /usr/bin/$BINARY
|
||||
|
||||
RUN \
|
||||
apk add tini && \
|
||||
addgroup -g $GID warriors && \
|
||||
adduser -D -G warriors -u $UID -g "" -h /opt/warriors warriors
|
||||
|
||||
RUN \
|
||||
chown -R warriors:warriors /mnt
|
||||
|
||||
VOLUME /mnt
|
||||
WORKDIR /opt/warriors
|
||||
USER warriors
|
||||
ENTRYPOINT ["/sbin/tini", "--"]
|
||||
CMD ["/usr/bin/warriors-names"]
|
|
@ -1,76 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
function require() {
|
||||
if [ "$1" = "" ]; then
|
||||
echo "input '$2' required"
|
||||
print_help
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
function print_help() {
|
||||
echo "deploy.sh"
|
||||
echo ""
|
||||
echo "Usage:"
|
||||
echo " deploy.sh [tag]"
|
||||
echo ""
|
||||
echo "Args:"
|
||||
echo " tag: The git tag to be applied to the repository and docker build"
|
||||
echo " branch: The git branch to use for tagging and publishing"
|
||||
}
|
||||
|
||||
function build_image() {
|
||||
tag=$1
|
||||
arch=$2
|
||||
|
||||
docker build \
|
||||
--pull \
|
||||
--build-arg TAG=$tag \
|
||||
-t asonix/warriors-names:$arch-$tag \
|
||||
-t asonix/warriors-names:$arch-latest \
|
||||
-f Dockerfile.$arch \
|
||||
.
|
||||
|
||||
docker push asonix/warriors-names:$arch-$tag
|
||||
docker push asonix/warriors-names:$arch-latest
|
||||
}
|
||||
|
||||
# Creating the new tag
|
||||
new_tag="$1"
|
||||
branch="$2"
|
||||
|
||||
require "$new_tag" "tag"
|
||||
require "$branch" "branch"
|
||||
|
||||
if ! docker run --rm -it arm64v8/alpine:3.11 /bin/sh -c 'echo "docker is configured correctly"'
|
||||
then
|
||||
echo "docker is not configured to run on qemu-emulated architectures, fixing will require sudo"
|
||||
sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
|
||||
fi
|
||||
|
||||
set -xe
|
||||
|
||||
git checkout $branch
|
||||
|
||||
# Changing the docker-compose prod
|
||||
sed -i "s/asonix\/warriors-names:.*/asonix\/warriors-names:$new_tag/" docker-compose.yml
|
||||
git add ../prod/docker-compose.yml
|
||||
|
||||
# The commit
|
||||
git commit -m"Version $new_tag"
|
||||
git tag $new_tag
|
||||
|
||||
# Push
|
||||
git push origin $new_tag
|
||||
git push
|
||||
|
||||
# Build for arm64v8, arm32v7, and amd64
|
||||
build_image $new_tag arm64v8
|
||||
build_image $new_tag arm32v7
|
||||
build_image $new_tag amd64
|
||||
|
||||
# Build for other archs
|
||||
# TODO
|
||||
|
||||
./manifest.sh asonix/warriors-names $new_tag
|
||||
./manifest.sh asonix/warriors-names latest
|
|
@ -2,7 +2,7 @@ version: '3.3'
|
|||
|
||||
services:
|
||||
warriors-names:
|
||||
image: asonix/warriors-names:v0.1.1-r0
|
||||
image: asonix/warriors-names:v0.2.1
|
||||
restart: always
|
||||
volumes:
|
||||
- ./volumes/warriors-names:/opt/warriors
|
||||
|
|
|
@ -1,43 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
function require() {
|
||||
if [ "$1" = "" ]; then
|
||||
echo "input '$2' required"
|
||||
print_help
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
function print_help() {
|
||||
echo "deploy.sh"
|
||||
echo ""
|
||||
echo "Usage:"
|
||||
echo " manifest.sh [repository] [tag]"
|
||||
echo ""
|
||||
echo "Args:"
|
||||
echo " repository: The docker repository hosting the images"
|
||||
echo " tag: The git tag to be applied to the image manifest"
|
||||
}
|
||||
|
||||
repo=$1
|
||||
new_tag=$2
|
||||
|
||||
require "$repo" "repository"
|
||||
require "$new_tag" "tag"
|
||||
|
||||
set -xe
|
||||
|
||||
docker manifest create $repo:$new_tag \
|
||||
-a $repo:arm64v8-$new_tag \
|
||||
-a $repo:arm32v7-$new_tag \
|
||||
-a $repo:amd64-$new_tag
|
||||
|
||||
docker manifest annotate $repo:$new_tag \
|
||||
$repo:arm64v8-$new_tag --os linux --arch arm64 --variant v8
|
||||
|
||||
docker manifest annotate $repo:$new_tag \
|
||||
$repo:arm32v7-$new_tag --os linux --arch arm --variant v7
|
||||
|
||||
docker manifest annotate $repo:$new_tag \
|
||||
$repo:amd64-$new_tag --os linux --arch amd64
|
||||
|
||||
docker manifest push $repo:$new_tag --purge
|
61
flake.lock
Normal file
61
flake.lock
Normal file
|
@ -0,0 +1,61 @@
|
|||
{
|
||||
"nodes": {
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1705309234,
|
||||
"narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1707546158,
|
||||
"narHash": "sha256-nYYJTpzfPMDxI8mzhQsYjIUX+grorqjKEU9Np6Xwy/0=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "d934204a0f8d9198e1e4515dd6fec76a139c87f0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
34
flake.nix
Normal file
34
flake.nix
Normal file
|
@ -0,0 +1,34 @@
|
|||
{
|
||||
description = "warriors-names";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
};
|
||||
|
||||
outputs = { self, nixpkgs, flake-utils }:
|
||||
flake-utils.lib.eachDefaultSystem (system:
|
||||
let
|
||||
pkgs = import nixpkgs {
|
||||
inherit system;
|
||||
};
|
||||
in
|
||||
{
|
||||
packages = rec {
|
||||
warriors-names = pkgs.callPackage ./warriors-names.nix { };
|
||||
|
||||
default = warriors-names;
|
||||
};
|
||||
|
||||
apps = rec {
|
||||
dev = flake-utils.lib.mkApp { drv = self.packages.${system}.warriors-names; };
|
||||
default = dev;
|
||||
};
|
||||
|
||||
devShell = with pkgs; mkShell {
|
||||
nativeBuildInputs = [ cargo cargo-outdated clippy gcc rust-analyzer rustc rustfmt ];
|
||||
|
||||
RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}";
|
||||
};
|
||||
});
|
||||
}
|
File diff suppressed because it is too large
Load diff
83
src/main.rs
83
src/main.rs
|
@ -1,22 +1,19 @@
|
|||
use anyhow::{anyhow, Result};
|
||||
use rand::{seq::SliceRandom, thread_rng, Rng};
|
||||
use rand::{thread_rng, Rng};
|
||||
use reqwest::{header::HeaderMap, Client};
|
||||
use std::{path::Path, time::Duration};
|
||||
use tokio::{fs::File, prelude::*, time::interval};
|
||||
use tokio_compat_02::FutureExt;
|
||||
use tokio::{fs::File, io::AsyncReadExt, io::AsyncWriteExt, time::interval};
|
||||
use url::Url;
|
||||
|
||||
mod description;
|
||||
mod name;
|
||||
|
||||
const DEFAULT_PREFIX: &str = "fire";
|
||||
const DEFAULT_SUFFIX: &str = "paw";
|
||||
const USER_AGENT: &str = "warriors-cats";
|
||||
const TOKEN_PATH: &str = "/oauth/token";
|
||||
const STATUS_URL: &str = "/api/v1/statuses";
|
||||
|
||||
#[derive(serde::Deserialize)]
|
||||
struct Config {
|
||||
names: Names,
|
||||
timing: Timing,
|
||||
mastodon: Mastodon,
|
||||
}
|
||||
|
@ -34,17 +31,11 @@ struct Timing {
|
|||
duration: u32,
|
||||
}
|
||||
|
||||
#[derive(serde::Deserialize)]
|
||||
struct Names {
|
||||
prefix: Vec<String>,
|
||||
suffix: Vec<String>,
|
||||
}
|
||||
|
||||
struct State {
|
||||
server: Url,
|
||||
client: Client,
|
||||
prefix: Vec<String>,
|
||||
suffix: Vec<String>,
|
||||
name: name::Config,
|
||||
description: description::Config,
|
||||
}
|
||||
|
||||
#[derive(serde::Serialize)]
|
||||
|
@ -87,7 +78,6 @@ impl Mastodon {
|
|||
scope: "read write",
|
||||
})
|
||||
.send()
|
||||
.compat()
|
||||
.await?;
|
||||
|
||||
if !res.status().is_success() {
|
||||
|
@ -97,40 +87,44 @@ impl Mastodon {
|
|||
));
|
||||
}
|
||||
|
||||
let token: Token = res.json().compat().await?;
|
||||
let token: Token = res.json().await?;
|
||||
Ok(token)
|
||||
}
|
||||
}
|
||||
|
||||
async fn read_token(path: impl AsRef<Path>) -> Result<Token> {
|
||||
let mut file = File::open(path).await?;
|
||||
let mut contents = vec![];
|
||||
file.read_to_end(&mut contents).await?;
|
||||
let mut contents = String::new();
|
||||
file.read_to_string(&mut contents).await?;
|
||||
|
||||
let token: Token = toml::from_slice(&contents)?;
|
||||
let token: Token = toml::from_str(&contents)?;
|
||||
Ok(token)
|
||||
}
|
||||
|
||||
async fn write_token(path: impl AsRef<Path>, token: &Token) -> Result<()> {
|
||||
let token_bytes = toml::to_vec(token)?;
|
||||
let token_bytes = toml::to_string(token)?;
|
||||
let mut file = File::create(path).await?;
|
||||
file.write_all(&token_bytes).await?;
|
||||
file.write_all(token_bytes.as_bytes()).await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
impl Config {
|
||||
async fn open(path: impl AsRef<Path>) -> Result<Self> {
|
||||
let mut file = File::open(path).await?;
|
||||
let mut contents = vec![];
|
||||
file.read_to_end(&mut contents).await?;
|
||||
let mut contents = String::new();
|
||||
file.read_to_string(&mut contents).await?;
|
||||
|
||||
let config: Config = toml::from_slice(&contents)?;
|
||||
let config: Config = toml::from_str(&contents)?;
|
||||
Ok(config)
|
||||
}
|
||||
|
||||
async fn to_state(self, token_path: impl AsRef<Path>) -> Result<State> {
|
||||
async fn into_state(
|
||||
self,
|
||||
token_path: impl AsRef<Path>,
|
||||
name: name::Config,
|
||||
description: description::Config,
|
||||
) -> Result<State> {
|
||||
let Config {
|
||||
names,
|
||||
timing: _,
|
||||
mastodon,
|
||||
} = self;
|
||||
|
@ -160,16 +154,14 @@ impl Config {
|
|||
Ok(State {
|
||||
server,
|
||||
client,
|
||||
prefix: names.prefix,
|
||||
suffix: names.suffix,
|
||||
name,
|
||||
description,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl State {
|
||||
async fn post(&self, rng: &mut impl Rng) -> Result<()> {
|
||||
let name = self.generate(rng);
|
||||
let description = description::run(rng);
|
||||
let mut url = self.server.clone();
|
||||
url.set_path(STATUS_URL);
|
||||
|
||||
|
@ -177,11 +169,10 @@ impl State {
|
|||
.client
|
||||
.post(url.as_str())
|
||||
.form(&Status {
|
||||
status: format!("{} - {}", name, description),
|
||||
status: self.gen(rng),
|
||||
visibility: "unlisted",
|
||||
})
|
||||
.send()
|
||||
.compat()
|
||||
.await?;
|
||||
|
||||
if !res.status().is_success() {
|
||||
|
@ -191,40 +182,26 @@ impl State {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn generate(&self, rng: &mut impl Rng) -> String {
|
||||
let prefix = self
|
||||
.prefix
|
||||
.choose(rng)
|
||||
.map(|s| s.as_str())
|
||||
.unwrap_or(DEFAULT_PREFIX);
|
||||
fn gen(&self, rng: &mut impl Rng) -> String {
|
||||
let name = self.name.gen(rng);
|
||||
let description = self.description.gen(rng);
|
||||
|
||||
let mut suffix;
|
||||
while {
|
||||
suffix = self
|
||||
.suffix
|
||||
.choose(rng)
|
||||
.map(|s| s.as_str())
|
||||
.unwrap_or(DEFAULT_SUFFIX);
|
||||
suffix == prefix
|
||||
} {}
|
||||
|
||||
let (first, rest) = prefix.split_at(1);
|
||||
|
||||
first.to_uppercase() + rest + &suffix
|
||||
format!("{} - {}", name, description)
|
||||
}
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<()> {
|
||||
let config = Config::open("Config.toml").await?;
|
||||
let name = name::config("Name.json").await?;
|
||||
let description = description::config("Description.json").await?;
|
||||
|
||||
let duration = Duration::from_secs(60) * config.timing.duration;
|
||||
let mut ticker = interval(duration);
|
||||
|
||||
let state = config.to_state("Token.toml").await?;
|
||||
let state = config.into_state("Token.toml", name, description).await?;
|
||||
|
||||
let mut rng = thread_rng();
|
||||
|
||||
loop {
|
||||
ticker.tick().await;
|
||||
state.post(&mut rng).await?;
|
||||
|
|
34
src/name.rs
Normal file
34
src/name.rs
Normal file
|
@ -0,0 +1,34 @@
|
|||
use anyhow::Result;
|
||||
use rand::{seq::SliceRandom, Rng};
|
||||
use std::path::Path;
|
||||
|
||||
#[derive(serde::Deserialize)]
|
||||
pub(crate) struct Config {
|
||||
prefix: Vec<String>,
|
||||
suffix: Vec<String>,
|
||||
}
|
||||
|
||||
impl Config {
|
||||
pub(crate) fn gen(&self, rng: &mut impl Rng) -> String {
|
||||
let prefix = self.prefix.choose(rng).map(|s| s.as_str()).unwrap();
|
||||
|
||||
let suffixes = self
|
||||
.suffix
|
||||
.iter()
|
||||
.filter(|s| *s != prefix)
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
let suffix = suffixes.choose(rng).unwrap().to_string();
|
||||
|
||||
let (first, rest) = prefix.split_at(1);
|
||||
|
||||
first.to_uppercase() + rest + &suffix
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) async fn config(path: impl AsRef<Path>) -> Result<Config> {
|
||||
let bytes = tokio::fs::read(path).await?;
|
||||
let config: Config = serde_json::from_slice(&bytes)?;
|
||||
|
||||
Ok(config)
|
||||
}
|
21
warriors-names.nix
Normal file
21
warriors-names.nix
Normal file
|
@ -0,0 +1,21 @@
|
|||
{ lib
|
||||
, nixosTests
|
||||
, rustPlatform
|
||||
}:
|
||||
|
||||
rustPlatform.buildRustPackage {
|
||||
pname = "warriors-names";
|
||||
version = "0.2.3";
|
||||
src = ./.;
|
||||
cargoLock.lockFile = ./Cargo.lock;
|
||||
|
||||
nativeBuildInputs = [ ];
|
||||
|
||||
passthru.tests = { inherit (nixosTests) warriors-names; };
|
||||
|
||||
meta = with lib; {
|
||||
description = "A simple image hosting service";
|
||||
homepage = "https://git.asonix.dog/asonix/warriors-names";
|
||||
license = with licenses; [ agpl3Plus ];
|
||||
};
|
||||
}
|
Loading…
Reference in a new issue