Skip to content

Commit

Permalink
Merge pull request #5 from soaska/deev2
Browse files Browse the repository at this point in the history
Deev2
  • Loading branch information
soaska authored Nov 29, 2024
2 parents bd48318 + f748f1a commit 0816323
Show file tree
Hide file tree
Showing 14 changed files with 499 additions and 230 deletions.
Binary file removed .DS_Store
Binary file not shown.
5 changes: 2 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@ cp example.env .env
vim .env
```

Запустим pocketbase, удалим существующую коллекцию users, затем перейдем во вкладку
settings / import collections. Далее в меню load from json выбираем [файл](https://github.com/soaska/faceswaper/blob/main/pocketbase/collections/PB%20Schema.json)
Запустим pocketbase, перейдем по её [url](http://0.0.0.0:8080/_/), создадим пользователя.
`pocketbase/collections/PB Schema.json`
```shell
podman compose up pocketbase
Expand All @@ -34,7 +33,7 @@ podman compose up -d --build
```

# Запуск
Запустим pocketbase по [этой](https://pocketbase.io/docs/) инструкции.
Запустим pocketbase по [этой](https://pocketbase.io/docs/) инструкции. Удалим collection `users`.
Зайдем во вкладку settings / import collections. Далее в меню load from json выбираем [файл](https://github.com/soaska/faceswaper/blob/main/pocketbase/collections/PB%20Schema.json)
pocketbase/collections/PB Schema.json

Expand Down
27 changes: 25 additions & 2 deletions compose.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,21 @@
services:
# own telegram api server
# needed to download / upload large files
# Container link: https://github.com/aiogram/telegram-bot-api
# Info about limitations: https://core.telegram.org/bots/api#using-a-local-bot-api-server
telegram-bot-api:
image: aiogram/telegram-bot-api:latest
hostname: tgapi
env_file:
- .env
volumes:
- ./data/telegram-bot-api:/var/lib/telegram-bot-api
ports:
- "8081:8081"
- "8082:8082" # statistics

pocketbase:
hostname: pocketbase
build:
context: ./pocketbase
dockerfile: Dockerfile
Expand All @@ -8,8 +24,13 @@ services:
- 8080:8080
volumes:
- ./pb_data:/pb/pb_data
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/api/health"]
interval: 30s
timeout: 10s
retries: 5

telegram-bot:
job-manager:
build:
context: ./job-manager
dockerfile: Dockerfile
Expand All @@ -20,8 +41,9 @@ services:
restart: unless-stopped
depends_on:
- pocketbase
- telegram-bot-api

job-manager:
telegram-bot:
build:
context: ./telegram-bot
dockerfile: Dockerfile
Expand All @@ -32,3 +54,4 @@ services:
restart: unless-stopped
depends_on:
- pocketbase
- telegram-bot-api
28 changes: 0 additions & 28 deletions docker-compose.yaml

This file was deleted.

12 changes: 9 additions & 3 deletions example.env
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
# telegram
TELEGRAM_API = https://api.telegram.org
TELEGRAM_API = "http://tgapi:8081"
TELEGRAM_APITOKEN = 1294890:asdasfdewioru3o2ier
BOT_DEBUG = false
BOT_DEBUG = true

# for own api server
# get from https://my.telegram.org/apps
TELEGRAM_API_ID=3456789
TELEGRAM_API_HASH=ydgwgyu779cdddw9c9qwd
TELEGRAM_STAT=1

# pocketbase
POCKETBASE_URL = http://0.0.0.0:8080
POCKETBASE_URL = "http://0.0.0.0:8080"
POCKETBASE_LOGIN = admin@supermario.carts
POCKETBASE_PASSWORD = MAShsRoOm
Binary file removed job-manager/.DS_Store
Binary file not shown.
160 changes: 160 additions & 0 deletions job-manager/database-requests.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import (
"net/http"
"net/url"
"os"
"path/filepath"
"strconv"

tgbotapi "github.com/OvyFlash/telegram-bot-api"
)
Expand Down Expand Up @@ -376,3 +378,161 @@ func getActiveJobs(userID, collection string) ([]map[string]interface{}, error)

return nil, nil
}

// Увеличение circle_count на 1 для владельца задачи
func incrementCircleCount(tgUserID int) error {
userInfo, err := getUserInfo(tgUserID)
if err != nil {
return fmt.Errorf("Ошибка получения информации о пользователе с Telegram ID %d: %v", tgUserID, err)
}
currentCircleCount, ok := userInfo["circle_count"].(float64) // JSON numbers в Go парсятся в float64
if !ok {
currentCircleCount = 0
}

newCircleCount := int(currentCircleCount) + 1

updateData := map[string]interface{}{
"circle_count": newCircleCount,
}

userID, ok := userInfo["id"].(string)
if !ok {
return fmt.Errorf("Не удалось извлечь ID пользователя с Telegram ID %d", tgUserID)
}

updateURL := fmt.Sprintf("%s/api/collections/users/records/%s", pocketBaseUrl, userID)

jsonData, err := json.Marshal(updateData)
if err != nil {
return fmt.Errorf("Ошибка сериализации данных для обновления: %v", err)
}

_, err = sendAuthorizedRequest("PATCH", updateURL, jsonData)
if err != nil {
return fmt.Errorf("Ошибка обновления circle_count для пользователя %s: %v", userID, err)
}

// log.Printf("circle_count для пользователя с Telegram ID %d успешно обновлен. Новое значение: %d", tgUserID, newCircleCount)
return nil
}

// Загрузка обработанного файла в output_media
func uploadOutputMedia(taskID, filePath string) error {
url := fmt.Sprintf("%s/api/collections/circle_jobs/records/%s", pocketBaseUrl, taskID)

file, err := os.Open(filePath)
if err != nil {
return fmt.Errorf("Ошибка открытия файла: %v", err)
}
defer file.Close()

body := &bytes.Buffer{}
writer := multipart.NewWriter(body)

// Добавляем файл
filePart, err := writer.CreateFormFile("output_media", filepath.Base(filePath))
if err != nil {
return fmt.Errorf("Ошибка добавления файла в запрос: %v", err)
}
_, err = io.Copy(filePart, file)
if err != nil {
return fmt.Errorf("Ошибка копирования содержимого файла: %v", err)
}

// Завершаем формирование multipart
writer.WriteField("status", "completed")
err = writer.Close()
if err != nil {
return fmt.Errorf("Ошибка завершения multipart: %v", err)
}

request, err := http.NewRequest("PATCH", url, body)
if err != nil {
return fmt.Errorf("Ошибка создания запроса: %v", err)
}

request.Header.Set("Authorization", fmt.Sprintf("Bearer %s", authToken))
request.Header.Set("Content-Type", writer.FormDataContentType())
client := &http.Client{}

resp, err := client.Do(request)
if err != nil {
return fmt.Errorf("Ошибка отправки запроса: %v", err)
}
defer resp.Body.Close()

if resp.StatusCode != http.StatusOK {
respBody, _ := io.ReadAll(resp.Body)
return fmt.Errorf("Ошибка загрузки файла: статус %d, ответ: %s", resp.StatusCode, string(respBody))
}

return nil
}

// Получение Telegram ID владельца
func getOwnerTGID(ownerID string) (string, error) {
url := fmt.Sprintf("%s/api/collections/users/records/%s", pocketBaseUrl, ownerID)
body, err := sendAuthorizedRequest("GET", url, nil)
if err != nil {
return "", fmt.Errorf("Ошибка получения данных о владельце: %v", err)
}

var ownerData struct {
TGID int `json:"tgid"`
}

err = json.Unmarshal(body, &ownerData)
if err != nil {
return "", fmt.Errorf("Ошибка разбора данных о владельце: %v", err)
}

if ownerData.TGID == 0 {
return "", fmt.Errorf("Telegram ID владельца %s не найден", ownerID)
}

return strconv.Itoa(ownerData.TGID), nil
}

// Получение задачи в статусе "queued"
func fetchQueuedCircleJob(collection string) (*Task, error) {
filter := "status='queued'"
url := fmt.Sprintf("%s/api/collections/%s/records?filter=%s&perPage=1", pocketBaseUrl, collection, filter)

body, err := sendAuthorizedRequest("GET", url, nil)
if err != nil {
return nil, fmt.Errorf("Ошибка при запросе задач: %v", err)
}

var response struct {
Items []Task `json:"items"`
}

err = json.Unmarshal(body, &response)
if err != nil {
return nil, fmt.Errorf("Ошибка разбора JSON: %v", err)
}

if len(response.Items) > 0 {
return &response.Items[0], nil
}

return nil, nil // Нет задач в статусе "queued"
}

// Обновление статуса задачи
func updateTaskStatus(taskID, status string) error {
url := fmt.Sprintf("%s/api/collections/circle_jobs/records/%s", pocketBaseUrl, taskID)

data := map[string]string{
"status": status,
}
jsonData, _ := json.Marshal(data)

_, err := sendAuthorizedRequest("PATCH", url, jsonData)
if err != nil {
return fmt.Errorf("Ошибка обновления статуса задачи: %v", err)
}

return nil
}
Loading

0 comments on commit 0816323

Please # to comment.