First small refactoring :)

With these tings:
- Create db during runtime
- Better generation of psv
- Lower case symbol descriptions
- Some Readme fixes
- ...
This commit is contained in:
J. Elfring (x) 2020-09-21 21:05:46 +02:00
parent 6cc15f513f
commit 4bf3fb5dad
13 changed files with 108 additions and 4544 deletions

2
.dockerignore Normal file
View file

@ -0,0 +1,2 @@
.*
env

2
.gitignore vendored
View file

@ -1,2 +1,2 @@
working-db.db3
*.db3
env

View file

@ -4,22 +4,23 @@ LABEL maintainer "J. Elfring <code@elfring.ms>"
LABEL org.opencontainers.image.source https://github.com/elfrinjo/compoBot
RUN apk --no-cache --update \
add bash \
ca-certificates \
add ca-certificates \
coreutils \
bash \
curl \
sed \
sqlite \
&& mkdir -p /app/sequences \
&& mkdir /data
&& mkdir /app \
&& mkdir /data
COPY sequences/Compose.db3 /app/sequences/Compose.db3
COPY compoBot.sh /app/compoBot.sh
COPY . /app/
ENV database="/data/working-db.db3" \
ENV database=/data/compobot.db3 \
minWait=43200 \
maxWait=86400 \
mtdApi="https://mastodon.example/api/v1/statuses" \
mtdVisibility="direct" \
mtdToken="THIS_SHOULD_BE_A_Bearer-Token"
mtdVisibility=direct \
mtdApi=https://mastodon.example/api/v1/statuses \
mtdToken=INSERT-YOUR-BEARER-TOKEN
VOLUME /data
WORKDIR /app

View file

@ -1,37 +1,29 @@
# compoBot — A bot to toot composekey sequences
The compose key (a.k.a. Multi Key) is a massively useful and
(unfortunately) forgotten feature.
It lets you type a keyboard sequence eg. `<Multi_Key><t><m>` and
it inserts a special character: ™.
The compose key (a.k.a. Multi Key) is a massively useful and (unfortunately) forgotten feature.
It lets you type a keyboard sequence eg. `<Multi_Key><t><m>` and it inserts a special character: ™.
This bot regularly toots one of those sequences to a mastodon
account so that everyone can appreciate them.
This bot regularly toots one of those sequences to a mastodon account so that everyone can appreciate them.
The sequences used, are standard on modern linux systems.
However, the compose/multikey is usually not mapped on most
keyboards.
With `xmodmap`, it can be mapped to a rarely used key like menu
or capslock.
On windows systems, there is
(WinCompose)[https://github.com/samhocevar/wincompose]
to get similar results.
However, the compose/multikey is usually not mapped on most keyboards.
With `xmodmap`, it can be mapped to a rarely used key like menu or capslock.
On windows systems, there is [WinCompose](https://github.com/samhocevar/wincompose) to get similar results.
## Usage
compoBot can be used from shell or docker.
The prerequisits are minimal: sqlite3, curl and the standard tools.
It is configured by environment variables wich may be set in a file
called env.
It is configured by environment variables wich may be set in a file called env.
| Variable | Default | Description |
|---------------|------------------------------------------|----------------------------------------------|
| database | ./working-db.db3 /data/working-db.db3 | Databasefile, should be persistant in docker |
| minWait | 43200 (12 h) | Minimum random time to wait between toots |
| maxWait | 86400 (24 h) | Maximum random time to wait between toots |
| mtdVisibility | direct | Privacy setting for the toot¹ |
| mtdApi | https://mastodon.example/api/v1/statuses | API endpoint to sent statuses² |
| mtdToken | THIS_SHOULD_BE_A_Bearer-Token | API authentication² |
| Variable | Default | Description |
|---------------|-----------------------------------------------|----------------------------------------------------------------|
| database | ./compobot.db3 (/data/compobot.db3 on Docker) | Databasefile |
| minWait | 43200 (=12 h) | Minimum random time to wait between toots in seconds |
| maxWait | 86400 (=24 h) | Maximum random time to wait between toots in seconds |
| mtdVisibility | direct | Privacy setting for the toot¹ (public unlisted private direct) |
| mtdApi | https://mastodon.example/api/v1/statuses | API endpoint to sent statuses² |
| mtdToken | INSERT-YOUR-BEARER-TOKEN | API authentication² |
¹) https://docs.joinmastodon.org/user/posting/
¹) https://docs.joinmastodon.org/entities/status/
²) https://docs.joinmastodon.org/methods/apps/#create-an-application

View file

@ -8,19 +8,20 @@
## Databasefile
database=${database:="./working-db.db3"}
database=${database:="./compobot.db3"}
## Wait-time between toots in seconds
minWait=${minWait:=5}
maxWait=${maxWait:=10}
minWait=${minWait:=43200}
maxWait=${maxWait:=86400}
## Mastodon Settings&Credentials
mtdVisibility=${mtdVisibility:="direct"} # public, unlisted, private, direct.
mtdApi=${mtdApi:="https://mastodon.example/api/v1/statuses"}
mtdToken=${mtdToken:="THIS_SHOULD_BE_A_Bearer-Token"}
mtdToken=${mtdToken:="INSERT-YOUR-BEARER-TOKEN"}
#####################################################################
## Source config fro env if there is a file called env.
test -f ./env && source ./env
echo "=============> App-Start at $(date +%Y-%m-%dT%H%M%S)"
@ -28,20 +29,20 @@ echo "=============> App-Start at $(date +%Y-%m-%dT%H%M%S)"
## Blow up on errors
set -e
## Get a fresh copy of the sequence-db if it doesn't exist.
test -f $database || cp sequences/Compose.db3 $database
while true ; do
echo "-------------> Toot-Start at $(date +%Y-%m-%dT%H%M%S)"
echo "-------------> Starting at $(date +%Y-%m-%dT%H%M%S)"
## Create Database if it does not exist
test -f $database || sh dbFactory.sh $database
## Number of rows still available,
## when no row is left, we will delete the sent-table and start over
## when no row is left, just recreate the database and startover.
rowsAvailable=$(sqlite3 "$database" "SELECT count(keySequenceROWID) FROM stillAvailable")
echo rowsAvailable: $rowsAvailable
if [ $rowsAvailable -eq 0 ] ; then
echo "Deleting the sent-table and starting ower."
sqlite3 "$database" "DELETE from alreadySent"
echo "Deleting the database and starting ower."
rm -f $database
sh dbFactory.sh $database
fi
## Pick a random row
@ -75,7 +76,7 @@ while true ; do
## Sleep until the next time
waitTime=$(shuf -i $minWait-$maxWait -n 1)
echo "Waiting for $waitTime seconds"
echo "Waiting for $waitTime seconds. " $(date -d "$waitTime seconds")
echo ""
sleep $waitTime

22
dbFactory.sh Normal file
View file

@ -0,0 +1,22 @@
#!/bin/bash
if [ $# -ne 1 ]; then
echo "This script shoud only be run from inside compoBot.sh"
echo ""
echo "Usage:"
echo "$ sh dbFactory.sh /path/to/new/dbfile.db3"
echo ""
exit 1
fi
target=$1
cat lib/Compose.pre \
| grep -i '^<multi' \
| grep -v '<dead' \
| grep -v '<U....>' \
| grep -v '<U.....>' \
| sed --regexp-extended 's/(.*>)\s*:\s\"(.*)\"\s*(\S*)\s*#\s*(.*)/\1+\2+\3+\L\4/' \
> /tmp/compose.psv
sqlite3 $target ".read lib/initDb.sql"

View file

@ -14,11 +14,11 @@ $ grep -i '^<multi' Compose.pre | grep -v '<dead' | grep -v '<U....>' | grep -v
Convert to psv
--------------
- Plus-separated-values because + is not used in the file.
- Remove tabs and squish spaces.
- Plus-separated-values because + is not used elsewhere in the file.
- Regex to extract the fields into psv.
- The second description is all-uppper, we'll convert it to all lower.
$ cat Compose.usable | tr -d "\t" | tr -s " " | sed --regexp-extended 's/(\S*)\s*: \"(.*)\"\s*(\S*)\s*#\s*(.*)/\1+\2+\3+\4/' > Compose.psv
$ sed --regexp-extended 's/(.*>)\s*:\s\"(.*)\"\s*(\S*)\s*#\s*(.*)/\1+\2+\3+\L\4/' Compose.usable > Compose.psv
Load into SQLite
----------------

40
lib/initDb.sql Normal file
View file

@ -0,0 +1,40 @@
-- A table for the sequences
CREATE TABLE "keySequences" (
"keySequence" TEXT NOT NULL,
"utfCharacter" TEXT NOT NULL,
"desc1" TEXT,
"desc2" TEXT
);
-- A table for characters we already sent.
CREATE TABLE "alreadySent" (
"keySequenceROWID" INTEGER,
"timestamp" INTEGER
);
-- A view with yet unsent characters
CREATE VIEW stillAvailable (
keySequenceROWID,
keySequence,
utfCharacter,
desc1,
desc2
)
AS
SELECT ROWID, keySequence, utfCharacter, desc1, desc2
FROM keySequences
WHERE ROWID NOT IN (
SELECT keySequenceROWID
FROM alreadySent
);
-- A table with some entry-phrases:
CREATE TABLE "phrases" (
"phrase" TEXT
);
-- Load Data
.mode csv
.separator "+"
.import lib/phrases.txt phrases
.import /tmp/compose.psv keySequences

Binary file not shown.

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff