mirror of
https://github.com/Steffo99/greed.git
synced 2024-12-04 11:24:19 +00:00
Co-authored-by: bpro <iserver12345@gmail.com>
This commit is contained in:
parent
5f59447240
commit
317f32900a
6 changed files with 180 additions and 18 deletions
44
.github/workflows/docker-image.yml
vendored
Normal file
44
.github/workflows/docker-image.yml
vendored
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
name: "Build Docker image"
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types:
|
||||||
|
- published
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-docker:
|
||||||
|
name: "🐳 Build and publish Docker image"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: "Checkout repository"
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: "❓ Find the release semantic version"
|
||||||
|
id: semver
|
||||||
|
uses: Steffo99/actions-semver@v0.1.0
|
||||||
|
|
||||||
|
- name: "🔨 Setup Buildx"
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
|
||||||
|
- name: "🔑 Login to GitHub Containers"
|
||||||
|
uses: docker/login-action@v1
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: RYGhub
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: "🏗 Build and push the Docker image"
|
||||||
|
uses: docker/build-push-action@v2
|
||||||
|
with:
|
||||||
|
tags: >-
|
||||||
|
ghcr.io/Steffo99/greed:${{ steps.semver.outputs.full }},
|
||||||
|
ghcr.io/Steffo99/greed:${{ steps.semver.outputs.patch }},
|
||||||
|
ghcr.io/Steffo99/greed:${{ steps.semver.outputs.minor }},
|
||||||
|
ghcr.io/Steffo99/greed:${{ steps.semver.outputs.major }},
|
||||||
|
ghcr.io/Steffo99/greed:latest
|
||||||
|
push: true
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -105,3 +105,4 @@ config/config.ini
|
||||||
config/config.toml
|
config/config.toml
|
||||||
*.sqlite
|
*.sqlite
|
||||||
*.sqlite-journal
|
*.sqlite-journal
|
||||||
|
data/
|
20
Dockerfile
Normal file
20
Dockerfile
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
FROM python:3.10 AS labels
|
||||||
|
LABEL maintainer="Stefano Pigozzi <me@steffo.eu>"
|
||||||
|
LABEL description="A customizable, multilanguage Telegram shop bot"
|
||||||
|
|
||||||
|
FROM labels AS dependencies
|
||||||
|
COPY requirements.txt ./requirements.txt
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
FROM dependencies AS greed
|
||||||
|
COPY . /usr/src/greed
|
||||||
|
WORKDIR /usr/src/greed
|
||||||
|
|
||||||
|
FROM greed AS entry
|
||||||
|
ENTRYPOINT ["python", "-OO"]
|
||||||
|
CMD ["core.py"]
|
||||||
|
|
||||||
|
FROM entry AS environment
|
||||||
|
ENV PYTHONUNBUFFERED=1
|
||||||
|
ENV CONFIG_PATH="/etc/greed/config.toml"
|
||||||
|
ENV DB_ENGINE="sqlite:////var/lib/greed/database.sqlite"
|
106
README.md
106
README.md
|
@ -16,7 +16,91 @@ Use the special credit card number `4242 4242 4242 4242` to add unlimited credit
|
||||||
|
|
||||||
![](https://i.imgur.com/9plMzO6.png)
|
![](https://i.imgur.com/9plMzO6.png)
|
||||||
|
|
||||||
## Installation
|
## Installation via Docker
|
||||||
|
|
||||||
|
This installation procedure assumes you are on a system with `docker` installed, with a supported CPU architecture.
|
||||||
|
|
||||||
|
### Requirements
|
||||||
|
|
||||||
|
* [Docker Engine](https://docs.docker.com/get-docker/)
|
||||||
|
* An Internet connection
|
||||||
|
* A Telegram bot token (obtainable at [@Botfather](https://t.me/Botfather))
|
||||||
|
* A payment provider token (obtainable by [connecting a provider with your bot](https://t.me/Botfather))
|
||||||
|
|
||||||
|
### Steps
|
||||||
|
|
||||||
|
1. Run a container using the project's Docker image:
|
||||||
|
```console
|
||||||
|
# docker run --volume "$(pwd)/config:/etc/greed" --volume "$(pwd)/strings:/usr/src/greed/strings" --volume "$(pwd)/data:/var/lib/greed" ghcr.io/steffo99/greed
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Edit the configuration file `config.toml` that was created in the `strings` directory, adding your bot and payment tokens to it:
|
||||||
|
```console
|
||||||
|
# nano config/config.toml
|
||||||
|
```
|
||||||
|
(Press **Ctrl+X** and then two times **Enter** to save and quit `nano`.)
|
||||||
|
|
||||||
|
3. _Optional:_ customize the files in the `strings` folder for custom messages.
|
||||||
|
|
||||||
|
4. Start the bot:
|
||||||
|
```console
|
||||||
|
python -OO core.py
|
||||||
|
```
|
||||||
|
|
||||||
|
5. Open Telegram, and send a `/start` command to your bot to be automatically promoted to 💼 Manager.
|
||||||
|
|
||||||
|
6. Stop the bot by pressing **Ctrl+C**.
|
||||||
|
|
||||||
|
### Running the bot
|
||||||
|
|
||||||
|
After the installation, to run the bot, you'll need to:
|
||||||
|
|
||||||
|
1. Run its Docker container from the same directory you installed it from:
|
||||||
|
```console
|
||||||
|
# docker run --volume "$(pwd)/config:/etc/greed" --volume "$(pwd)/strings:/usr/src/greed/strings" --volume "$(pwd)/data:/var/lib/greed" ghcr.io/steffo99/greed
|
||||||
|
```
|
||||||
|
|
||||||
|
### Keep the bot running
|
||||||
|
|
||||||
|
If you want to keep the bot open even after you closed your terminal window, you'll need to pass the appropriate arguments to the docker command:
|
||||||
|
|
||||||
|
1. Set the Docker container to always restart and to detach on successful start:
|
||||||
|
```console
|
||||||
|
# docker run --detach --restart always --volume "$(pwd)/config:/etc/greed" --volume "$(pwd)/strings:/usr/src/greed/strings" --volume "$(pwd)/data:/var/lib/greed" ghcr.io/steffo99/greed
|
||||||
|
```
|
||||||
|
|
||||||
|
### Updating
|
||||||
|
|
||||||
|
To update the bot, run the following commands:
|
||||||
|
|
||||||
|
1. Find the ID of the Docker container of the bot:
|
||||||
|
```console
|
||||||
|
# docker container ls
|
||||||
|
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||||
|
abcdefabcdef ghcr.io/steffo99/greed "python -OO core.py" 6 seconds ago Up Less than a second relaxed_hypatia
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Stop the Docker container of the bot:
|
||||||
|
```console
|
||||||
|
# docker container stop abcdefabcdef
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Remove the Docker container of the bot:
|
||||||
|
```console
|
||||||
|
# docker container rm abcdefabcdef
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Pull the latest Docker image of the bot:
|
||||||
|
```console
|
||||||
|
# docker pull ghcr.io/steffo99/greed:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
5. Restart the bot with the newly downloaded image:
|
||||||
|
```console
|
||||||
|
# docker run --detach --restart always --volume "$(pwd)/config:/etc/greed" --volume "$(pwd)/strings:/usr/src/greed/strings" --volume "$(pwd)/data:/var/lib/greed" ghcr.io/steffo99/greed
|
||||||
|
```
|
||||||
|
|
||||||
|
## Installation from source
|
||||||
|
|
||||||
This installation procedure assumes you are on a Linux system, using `bash` and have `python3.8` installed.
|
This installation procedure assumes you are on a Linux system, using `bash` and have `python3.8` installed.
|
||||||
|
|
||||||
|
@ -33,42 +117,42 @@ Consider renting a VPS to host the bot on; a cheap one should do, as greed is pr
|
||||||
### Steps
|
### Steps
|
||||||
|
|
||||||
1. Download the project files by running:
|
1. Download the project files by running:
|
||||||
```bash
|
```console
|
||||||
git clone https://github.com/Steffo99/greed.git
|
git clone https://github.com/Steffo99/greed.git
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Enter the newly created folder:
|
2. Enter the newly created folder:
|
||||||
```bash
|
```console
|
||||||
cd greed
|
cd greed
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Create a new virtualenv:
|
3. Create a new virtualenv:
|
||||||
```bash
|
```console
|
||||||
python3.8 -m venv venv
|
python3.8 -m venv venv
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Activate the virtualenv:
|
4. Activate the virtualenv:
|
||||||
```bash
|
```console
|
||||||
source venv/bin/activate
|
source venv/bin/activate
|
||||||
```
|
```
|
||||||
|
|
||||||
5. Install the project requirements:
|
5. Install the project requirements:
|
||||||
```bash
|
```console
|
||||||
pip install -r requirements.txt
|
pip install -r requirements.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
6. _Optional:_ For colored console output, install [coloredlogs](https://pypi.org/project/coloredlogs/):
|
6. _Optional:_ For colored console output, install [coloredlogs](https://pypi.org/project/coloredlogs/):
|
||||||
```bash
|
```console
|
||||||
pip install coloredlogs
|
pip install coloredlogs
|
||||||
```
|
```
|
||||||
|
|
||||||
7. Generate the configuration file:
|
7. Generate the configuration file:
|
||||||
```bash
|
```console
|
||||||
python -OO core.py
|
python -OO core.py
|
||||||
```
|
```
|
||||||
|
|
||||||
8. Edit the configuration file, adding your bot and payment tokens to it:
|
8. Edit the configuration file `config.toml`, adding your bot and payment tokens to it:
|
||||||
```bash
|
```console
|
||||||
nano config/config.toml
|
nano config/config.toml
|
||||||
```
|
```
|
||||||
(Press **Ctrl+X** and then two times **Enter** to save and quit `nano`.)
|
(Press **Ctrl+X** and then two times **Enter** to save and quit `nano`.)
|
||||||
|
@ -76,7 +160,7 @@ Consider renting a VPS to host the bot on; a cheap one should do, as greed is pr
|
||||||
9. _Optional:_ customize the files in the `strings` folder for custom messages.
|
9. _Optional:_ customize the files in the `strings` folder for custom messages.
|
||||||
|
|
||||||
10. Start the bot:
|
10. Start the bot:
|
||||||
```bash
|
```console
|
||||||
python -OO core.py
|
python -OO core.py
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@ fallback_language = "en"
|
||||||
[Database]
|
[Database]
|
||||||
# The database engine you want to use.
|
# The database engine you want to use.
|
||||||
# Refer to http://docs.sqlalchemy.org/en/latest/core/engines.html for the possible settings.
|
# Refer to http://docs.sqlalchemy.org/en/latest/core/engines.html for the possible settings.
|
||||||
|
# This value is ignored if you're running greed via Docker, or if the DB_ENGINE environment variable is set.
|
||||||
engine = "sqlite:///database.sqlite"
|
engine = "sqlite:///database.sqlite"
|
||||||
|
|
||||||
|
|
||||||
|
|
24
core.py
24
core.py
|
@ -33,26 +33,29 @@ def main():
|
||||||
log.fatal("config/template_config.toml does not exist!")
|
log.fatal("config/template_config.toml does not exist!")
|
||||||
exit(254)
|
exit(254)
|
||||||
|
|
||||||
|
# Check where the config path is located from the CONFIG_PATH environment variable
|
||||||
|
config_path = os.environ.get("CONFIG_PATH", "config/config.toml")
|
||||||
|
|
||||||
# If the config file does not exist, clone the template and exit
|
# If the config file does not exist, clone the template and exit
|
||||||
if not os.path.isfile("config/config.toml"):
|
if not os.path.isfile(config_path):
|
||||||
log.debug("config/config.toml does not exist.")
|
log.debug("config/config.toml does not exist.")
|
||||||
|
|
||||||
with open("config/template_config.toml", encoding="utf8") as template_cfg_file, \
|
with open("config/template_config.toml", encoding="utf8") as template_cfg_file, \
|
||||||
open("config/config.toml", "w", encoding="utf8") as user_cfg_file:
|
open(config_path, "w", encoding="utf8") as user_cfg_file:
|
||||||
# Copy the template file to the config file
|
# Copy the template file to the config file
|
||||||
user_cfg_file.write(template_cfg_file.read())
|
user_cfg_file.write(template_cfg_file.read())
|
||||||
|
|
||||||
log.fatal("A config file has been created in config/config.toml."
|
log.fatal("A config file has been created."
|
||||||
" Customize it, then restart greed!")
|
" Customize it, then restart greed!")
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
# Compare the template config with the user-made one
|
# Compare the template config with the user-made one
|
||||||
with open("config/template_config.toml", encoding="utf8") as template_cfg_file, \
|
with open("config/template_config.toml", encoding="utf8") as template_cfg_file, \
|
||||||
open("config/config.toml", encoding="utf8") as user_cfg_file:
|
open(config_path, encoding="utf8") as user_cfg_file:
|
||||||
template_cfg = nuconfig.NuConfig(template_cfg_file)
|
template_cfg = nuconfig.NuConfig(template_cfg_file)
|
||||||
user_cfg = nuconfig.NuConfig(user_cfg_file)
|
user_cfg = nuconfig.NuConfig(user_cfg_file)
|
||||||
if not template_cfg.cmplog(user_cfg):
|
if not template_cfg.cmplog(user_cfg):
|
||||||
log.fatal("There were errors while parsing the config.toml file. Please fix them and restart greed!")
|
log.fatal("There were errors while parsing the config file. Please fix them and restart greed!")
|
||||||
exit(2)
|
exit(2)
|
||||||
else:
|
else:
|
||||||
log.debug("Configuration parsed successfully!")
|
log.debug("Configuration parsed successfully!")
|
||||||
|
@ -71,9 +74,18 @@ def main():
|
||||||
# Ignore most python-telegram-bot logs, as they are useless most of the time
|
# Ignore most python-telegram-bot logs, as they are useless most of the time
|
||||||
logging.getLogger("telegram").setLevel("ERROR")
|
logging.getLogger("telegram").setLevel("ERROR")
|
||||||
|
|
||||||
|
# Find the database URI
|
||||||
|
# Through environment variables first
|
||||||
|
if db_engine := os.environ.get("DB_ENGINE"):
|
||||||
|
log.debug("Sqlalchemy engine overridden by the DB_ENGINE envvar.")
|
||||||
|
# Then via the config file
|
||||||
|
else:
|
||||||
|
db_engine = user_cfg["Database"]["engine"]
|
||||||
|
log.debug("Using sqlalchemy engine set in the configuration file.")
|
||||||
|
|
||||||
# Create the database engine
|
# Create the database engine
|
||||||
log.debug("Creating the sqlalchemy engine...")
|
log.debug("Creating the sqlalchemy engine...")
|
||||||
engine = sqlalchemy.create_engine(user_cfg["Database"]["engine"])
|
engine = sqlalchemy.create_engine(db_engine)
|
||||||
log.debug("Binding metadata to the engine...")
|
log.debug("Binding metadata to the engine...")
|
||||||
database.TableDeclarativeBase.metadata.bind = engine
|
database.TableDeclarativeBase.metadata.bind = engine
|
||||||
log.debug("Creating all missing tables...")
|
log.debug("Creating all missing tables...")
|
||||||
|
|
Loading…
Reference in a new issue