Compare commits

...

35 commits

Author SHA1 Message Date
asonix 4717e4fdb2 Strip release binaries
All checks were successful
/ check (armv7-unknown-linux-musleabihf) (push) Successful in 55s
/ check (x86_64-unknown-linux-musl) (push) Successful in 53s
/ clippy (push) Successful in 26s
/ tests (push) Successful in 26s
/ check (aarch64-unknown-linux-musl) (push) Successful in 42s
2024-02-12 15:17:51 -06:00
asonix 73002d4d35 Remove prerelease marker
Some checks failed
/ clippy (push) Successful in 31s
/ tests (push) Successful in 23s
/ check (aarch64-unknown-linux-musl) (push) Successful in 37s
/ check (x86_64-unknown-linux-musl) (push) Failing after 11s
/ check (armv7-unknown-linux-musleabihf) (push) Successful in 42s
2024-02-12 14:33:52 -06:00
asonix a335225088 Add actions, remove drone
All checks were successful
/ check (aarch64-unknown-linux-musl) (push) Successful in 33s
/ check (armv7-unknown-linux-musleabihf) (push) Successful in 34s
/ check (x86_64-unknown-linux-musl) (push) Successful in 39s
/ clippy (push) Successful in 28s
/ tests (push) Successful in 22s
/ publish-docker (push) Successful in 12s
/ publish-forgejo (push) Successful in 12s
/ publish-crate (push) Successful in 30s
/ build (map[artifact:linux-amd64 platform:linux/amd64 target:x86_64-unknown-linux-musl]) (push) Successful in 1m29s
/ build (map[artifact:linux-arm32v7 platform:linux/arm/v7 target:armv7-unknown-linux-musleabihf]) (push) Successful in 1m32s
/ build (map[artifact:linux-arm64v8 platform:linux/arm64 target:aarch64-unknown-linux-musl]) (push) Successful in 1m9s
2024-02-11 19:24:26 -06:00
asonix 0d9ec4cc87 Bump version 2024-02-11 19:20:56 -06:00
asonix 21ffc4111e Update toml 2024-02-11 19:20:32 -06:00
asonix a2abc146f4 Add flake 2024-02-11 19:20:09 -06:00
asonix 7b188e2fa1 Bump version
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2022-12-22 14:57:55 -06:00
asonix 801747c7bc Set workdir to /mnt, add cargo toml fields 2022-12-22 14:57:42 -06:00
asonix 39e2344fb2 Remove previous deploy logic
All checks were successful
continuous-integration/drone/push Build is passing
2022-12-22 14:42:14 -06:00
asonix d163a3cf79 Bump version
Some checks failed
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is failing
2022-12-22 14:38:18 -06:00
asonix c834b6c913 Setup drone 2022-12-22 14:36:56 -06:00
asonix 74b011afe9 Version v0.2.0 2022-12-22 14:29:47 -06:00
asonix 4ccba45d58 Bump version 2022-12-22 14:28:55 -06:00
asonix 5db1dbc96c Update to tokio 1, fix clippy lints 2022-12-22 14:28:26 -06:00
asonix 2d5da08bad Update with names from series 4, firestar's quest, skyclan's destiny 2020-11-19 11:42:52 -06:00
asonix 17177cb6ea Update with names from series 4 book 1 2020-11-09 22:20:42 -06:00
asonix 26df437691 Add more names from series 3 2020-11-08 19:49:44 -06:00
asonix 64ea25c915 Don't apply 'jet' to eyes, 'very' to jet 2020-10-31 18:35:59 -05:00
asonix 203ffbbbaf Add jet black 2020-10-31 18:28:04 -05:00
asonix 88aa177f7c Update deps 2020-10-31 18:14:31 -05:00
asonix afe081a099 Version v0.1.5 2020-10-31 18:03:20 -05:00
asonix 5b02cbec16 Add forbids, update description colors, names 2020-10-31 18:03:02 -05:00
asonix faec338d57 Be more consistent with formatting json 2020-10-31 16:43:33 -05:00
asonix 909ce8af4c Version v0.1.4 2020-10-31 15:35:33 -05:00
asonix 58b48871b1 Bump version 2020-10-31 15:34:12 -05:00
asonix 50d41873cd Rewrite description generator to use json config 2020-10-31 15:33:07 -05:00
asonix e9510092c5 Add more prefixes, suffixes 2020-10-29 19:19:46 -05:00
asonix 78e4d834ed Version v0.1.3-r0 2020-10-27 18:21:09 -05:00
asonix 71cb19ff83 Bump version, deps 2020-10-27 18:20:24 -05:00
asonix 8a0e026fc5 Fix tortoiseshell gender frequency 2020-10-27 18:19:00 -05:00
asonix 103a320898 Version v0.1.2-r0 2020-10-26 17:57:22 -05:00
asonix 1a42a82e91 Bump version 2020-10-26 17:55:25 -05:00
asonix 047b5c27ee Allow basic cats to not have gender 2020-10-26 17:49:26 -05:00
asonix de0dd9580c More names from s2b6 2020-10-26 10:43:07 -05:00
asonix 6a84b7cb7e Add more prefixes to example 2020-10-23 16:08:24 -05:00
21 changed files with 1826 additions and 1761 deletions

View 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 }}

View 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
View file

@ -1,3 +1,6 @@
/target
Token.toml
Config.toml
.envrc
.direnv
result

1016
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -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"] }

View file

@ -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
View 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
View 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
View 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"]

View file

@ -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"]

View file

@ -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"]

View file

@ -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"]

View file

@ -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

View file

@ -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

View file

@ -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
View 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
View 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

View file

@ -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
View 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
View 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 ];
};
}