diff --git a/.deepsource.toml b/.deepsource.toml new file mode 100644 index 0000000..25bc3d7 --- /dev/null +++ b/.deepsource.toml @@ -0,0 +1,8 @@ +version = 1 + +[[analyzers]] +name = "python" +enabled = true + + [analyzers.meta] + runtime_version = "3.x.x" diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..f08de3a --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +custom: ['https://afdian.net/@xtaodada'] diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..efe62b1 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,24 @@ +## Description + +Please carefully read the [Contributing note](https://github.com/TeamPGM/PagerMaid-Pyro/blob/stable/CONTRIBUTING.md) and [Code of conduct](https://github.com/TeamPGM/PagerMaid-Pyro/blob/development/CODE_OF_CONDUCT.md) before making any pull requests. +And, **Do not make a pull request to merge into master unless it is a hotfix. Use the development branch instead.** + +## Issues fixed by this PR + + + +## Type of changes + + + +- [ ] Bug fix +- [ ] New feature +- [ ] Enhancement +- [ ] Documentation + +## Checklist: + +- [ ] My code follows the style guidelines of this project +- [ ] My pull request is unique and no other pull requests have been opened for these changes +- [ ] I have read the [Contributing note](https://github.com/TeamPGM/PagerMaid-Pyro/blob/stable/CONTRIBUTING.md) and [Code of conduct](https://github.com/TeamPGM/PagerMaid-Pyro/blob/development/CODE_OF_CONDUCT.md) +- [ ] I am responsible for any copyright issues with my code if it occurs in the future. diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 0000000..9efc870 --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,74 @@ +name: "Docker Build" + +# Controls when the action will run. +on: + # Triggers the workflow on push or pull request events but only for the master branch + workflow_dispatch: ~ + push: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + name: docker build and publish + env: + DOCKER_BUILDKIT: 1 + DOCKER_CLI_EXPERIMENTAL: enabled + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKERHUB_REPOSITORY: ${{ secrets.DOCKER_REPO }} + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Login to DockerHub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_TOKEN }} + + - name: Setup Docker Buildx + uses: crazy-max/ghaction-docker-buildx@v3 + + - name: Buildx cache + uses: actions/cache@v2 + id: buildx-cache + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx + + - name: Build + run: | + declare -a IMAGES + + echo "Build amd64" + docker buildx build \ + --cache-from "type=local,src=/tmp/.buildx-cache" \ + --cache-to "type=local,dest=/tmp/.buildx-cache" \ + --output "type=image,push=true" \ + --platform linux/amd64 \ + --build-arg "S6_ARCH=amd64" \ + --tag "${DOCKERHUB_REPOSITORY}:latest-amd64" \ + -f Dockerfile \ + . + IMAGES+=( "${DOCKERHUB_REPOSITORY}:latest-amd64" ) + + echo "Build arm64-v8" + docker buildx build \ + --cache-from "type=local,src=/tmp/.buildx-cache" \ + --cache-to "type=local,dest=/tmp/.buildx-cache" \ + --output "type=image,push=true" \ + --platform linux/arm64/v8 \ + --build-arg "S6_ARCH=aarch64" \ + --tag "${DOCKERHUB_REPOSITORY}:latest-arm64-v8" \ + -f Dockerfile \ + . + IMAGES+=( "${DOCKERHUB_REPOSITORY}:latest-arm64-v8" ) + + echo "Create manifest lists" + docker manifest create "${DOCKERHUB_REPOSITORY}:latest" "${IMAGES[@]}" + + echo "Annotate manifest lists to add architecture variants that aren't picked up automatically" + docker manifest annotate "${DOCKERHUB_REPOSITORY}:latest" "${DOCKERHUB_REPOSITORY}:latest-arm64-v8" --variant "v8" + + echo "Push manifest lists & delete local copies" + docker manifest push --purge "${DOCKERHUB_REPOSITORY}:latest" diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..4c59044 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,123 @@ +FROM ubuntu:latest +ARG S6_VERSION=v2.2.0.3 +ARG S6_ARCH=amd64 +ARG DEBIAN_FRONTEND=noninteractive +ARG USER_NAME=pagermaid +ARG WORK_DIR=/pagermaid/workdir +ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ + SHELL=/bin/bash \ + LANG=zh_CN.UTF-8 \ + PS1="\u@\h:\w \$ " \ + RUN_AS_ROOT=true +SHELL ["/bin/bash", "-c"] +WORKDIR $WORK_DIR +RUN source ~/.bashrc \ + ## 安装运行环境依赖,自编译建议修改为国内镜像源 +# && sed -i 's/archive.ubuntu.com/mirrors.bfsu.edu.cn/g' /etc/apt/sources.list \ +# && sed -i 's/security.ubuntu.com/mirrors.bfsu.edu.cn/g' /etc/apt/sources.list \ +# && sed -i 's/ports.ubuntu.com/mirrors.bfsu.edu.cn/g' /etc/apt/sources.list \ + && apt-get update \ + && apt-get upgrade -y \ + && apt-get install --no-install-recommends -y \ + python3 \ + python3-pip \ + tesseract-ocr \ + tesseract-ocr-eng \ + tesseract-ocr-chi-sim \ + language-pack-zh-hans \ + sudo \ + git \ + openssl \ + curl \ + wget \ + neofetch \ + imagemagick \ + ffmpeg \ + fortune-mod \ + figlet \ + libmagic1 \ + libzbar0 \ + iputils-ping \ + ## 安装s6 + && curl -L -o /tmp/s6-overlay-installer https://github.com/just-containers/s6-overlay/releases/download/${S6_VERSION}/s6-overlay-${S6_ARCH}-installer \ + && chmod +x /tmp/s6-overlay-installer \ + && /tmp/s6-overlay-installer / \ + ## 安装编译依赖 + && apt-get update \ + && apt-get install --no-install-recommends -y \ + ## 这是跨平台交叉编译要用到的包,如果自行构建,有可能不需要 + build-essential \ + apt-utils \ + python3-dev \ + libxslt1-dev \ + libxml2-dev \ + libssl-dev \ + libffi-dev \ + zlib1g-dev \ + tcl8.6-dev \ + tk8.6-dev \ + libimagequant-dev \ + libraqm-dev \ + libjpeg-dev \ + libtiff5-dev \ + libopenjp2-7-dev \ + libfreetype6-dev \ + liblcms2-dev \ + libwebp-dev \ + python3-tk \ + libharfbuzz-dev \ + libfribidi-dev \ + libxcb1-dev \ + pkg-config \ + ## 设置时区 + && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ + && echo "Asia/Shanghai" > /etc/timezone \ + ## python软链接 + && ln -sf /usr/bin/python3 /usr/bin/python \ + ## 升级pip +# && pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple \ + && python -m pip install --upgrade pip \ + ## 添加用户 + && useradd $USER_NAME -u 917 -U -r -m -d /$USER_NAME -s /bin/bash \ + && usermod -aG sudo,users $USER_NAME \ + && echo "$USER_NAME ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/$USER_NAME \ + ## 克隆仓库 + && git clone -b master https://github.com/TeamPGM/PagerMaid-Pyro.git $WORK_DIR \ + && git config --global pull.ff only \ + ## 复制s6启动脚本 + && cp -r s6/* / \ + ## pip install + && pip install -r requirements.txt \ + ## 卸载编译依赖,清理安装缓存 + && sudo apt-get purge --auto-remove -y \ + build-essential \ + apt-utils \ + python3-dev \ + libxslt1-dev \ + libxml2-dev \ + libssl-dev \ + libffi-dev \ + zlib1g-dev \ + tcl8.6-dev \ + tk8.6-dev \ + libimagequant-dev \ + libraqm-dev \ + libjpeg-dev \ + libtiff5-dev \ + libopenjp2-7-dev \ + libfreetype6-dev \ + liblcms2-dev \ + libwebp-dev \ + python3-tk \ + libharfbuzz-dev \ + libfribidi-dev \ + libxcb1-dev \ + pkg-config \ + && apt-get clean -y \ + && rm -rf \ + ## 删除apt和pip的安装缓存 + /tmp/* \ + /var/lib/apt/lists/* \ + /var/tmp/* \ + ~/.cache +ENTRYPOINT ["/init"] diff --git a/pagermaid/__init__.py b/pagermaid/__init__.py index bed83bd..73e8216 100644 --- a/pagermaid/__init__.py +++ b/pagermaid/__init__.py @@ -8,7 +8,7 @@ from pagermaid.config import Config import pyromod.listen from pyrogram import Client -pgm_version = "1.0.0" +pgm_version = "1.0.1" CMD_LIST = {} module_dir = __path__[0] working_dir = getcwd() diff --git a/pagermaid/sub_utils.py b/pagermaid/sub_utils.py new file mode 100644 index 0000000..f79e8b3 --- /dev/null +++ b/pagermaid/sub_utils.py @@ -0,0 +1,34 @@ +from typing import List +from pagermaid.single_utils import sqlite + + +class Sub: + def __init__(self, name: str): + self.name = name + + def get_subs(self) -> List: + return sqlite.get(f"{self.name}.sub", []) + + def clear_subs(self) -> None: + sqlite[f"{self.name}.sub"] = [] + del sqlite[f"{self.name}.sub"] + + def add_id(self, uid: int) -> bool: + data = self.get_subs() + if uid in data: + return False + data.append(uid) + sqlite[f"{self.name}.sub"] = data + return True + + def del_id(self, uid: int) -> bool: + data = self.get_subs() + if uid not in data: + return False + data.remove(uid) + sqlite[f"{self.name}.sub"] = data + return True + + def check_id(self, uid: int) -> bool: + data = self.get_subs() + return uid in data diff --git a/s6/etc/cont-init.d/10-adduser b/s6/etc/cont-init.d/10-adduser new file mode 100644 index 0000000..d2bba68 --- /dev/null +++ b/s6/etc/cont-init.d/10-adduser @@ -0,0 +1,8 @@ +#!/usr/bin/with-contenv bash + +if [[ $RUN_AS_ROOT != true ]]; then + PUID=${PUID:-917} + PGID=${PGID:-917} + groupmod -o -g "$PGID" pagermaid + usermod -o -u "$PUID" pagermaid +fi diff --git a/s6/etc/cont-init.d/20-update b/s6/etc/cont-init.d/20-update new file mode 100644 index 0000000..4bc9b6d --- /dev/null +++ b/s6/etc/cont-init.d/20-update @@ -0,0 +1,11 @@ +#!/usr/bin/with-contenv bash + +cd /pagermaid/workdir +git remote set-url origin https://github.com/TeamPGM/PagerMaid-Pyro.git +git pull + +pip install -r requirements.txt +if [ -s requirements2.txt ]; then + pip install -r requirements2.txt +fi +exit 0 diff --git a/s6/etc/cont-init.d/30-config b/s6/etc/cont-init.d/30-config new file mode 100644 index 0000000..b5da116 --- /dev/null +++ b/s6/etc/cont-init.d/30-config @@ -0,0 +1,5 @@ +#!/usr/bin/with-contenv bash + +if [[ $RUN_AS_ROOT != true ]]; then + chown -R pagermaid:pagermaid /pagermaid +fi \ No newline at end of file diff --git a/s6/etc/services.d/pagermaid/run b/s6/etc/services.d/pagermaid/run new file mode 100644 index 0000000..51dd952 --- /dev/null +++ b/s6/etc/services.d/pagermaid/run @@ -0,0 +1,9 @@ +#!/usr/bin/with-contenv bash + +cd /pagermaid/workdir +if [[ $RUN_AS_ROOT != true ]]; then + exec s6-setuidgid pagermaid python -m pagermaid +else + exec s6-setuidgid root python -m pagermaid +fi +