8 Commits

Author SHA1 Message Date
5456ca5120 feat: docs 2025-11-27 20:47:57 +03:00
20b6841043 refactor: dedicated package in cmd 2025-11-27 20:12:18 +03:00
f1d7cf656c fix: mutex handling in wholescreencapture 2025-11-27 15:29:33 +03:00
a76be07298 Update README.md 2025-11-27 13:33:02 +03:00
8e55175ff1 Update README.md 2025-11-27 13:29:49 +03:00
ef5671d8ed Update README.md 2025-11-27 13:29:10 +03:00
4dbf40c4a0 Update README.md 2025-11-27 13:28:04 +03:00
050fae6fd2 Update README.md 2025-11-27 13:26:20 +03:00
5 changed files with 44 additions and 10 deletions

View File

@@ -1,7 +1,7 @@
APP_NAME := autoattendance
SRC_DIR := ./
BUILD_DIR := bin
CMD_PATH := ./cmd
CMD_PATH := ./cmd/
GOCMD := go
GOBUILD := $(GOCMD) build -v

View File

@@ -19,13 +19,15 @@
- [x] Обнаружение QR-кодов
- [x] Вывод ссылки в консоль
- [x] Автоматический переход по ссылке
- [x] Звуковой сигнал
### ⏰ Запланированные
- [ ] GUI
- [ ] Звуковой сигнал
- [ ] Push-уведомления с ntfy
### 🤔 На рассмотрении
- [ ] Работа при свёрнутом окне
- [ ] Скриншот только области окна браузера
- [ ] Работа при свёрнутом окне браузера
- [ ] Отметка через API журнала
## 📐 Реализация
@@ -38,8 +40,9 @@
Вам потребуется поддерживаемая операционная система из списка ниже. Если галочки нет, то поддержка появится в будущем.
- [x] Linux (Wayland)
- [ ] Linux (XORG)
- [x] Windows 10/11
- [x] Linux (XORG)
- [ ] Windows 10/11 (не тестировалось, должно билдиться)
- [ ] MacOS (не тестировалось, должно билдиться)
### ⬇️ Установка
@@ -47,7 +50,8 @@
### ⚙️ Настройка
При первом запуске будет необходимо выполнить настройку приложения. Для этого нужно выбрать соответствующий пункт меню и следовать инструкциям на экране. Если Вы получили готовый файл настройки из другого источника, можно передать программе его URL.
При первом запуске будет необходимо выполнить настройку приложения. В Linux файл конфигурации располагается здесь:
`~/.config/auto-attendance/auto-attendance.toml`. Необходимо получить актуальный файл конфигурации, который будет работать с конкретным журналом посещений
## 🔨 Сборка
@@ -59,7 +63,24 @@
- opencv 4.12.0
- go 1.25.4
### Linux & MacOS & Windows
### Go
Используйте следующую команду в терминале:
```bash
go install git.weirdcat.su/weirdcat/auto-attendance/cmd/qrminator-cli@main
```
Далее можно запускать командой:
```bash
qrminator-cli
```
Убедитесь, что вы добавили `~/.go/bin` в PATH. Например:
```bash
export PATH=$PATH:~/.go/bin
```
### Make
Склонируйте мой репозиторий:
```bash

View File

@@ -198,7 +198,7 @@ func (a *appImpl) processScreenshot() {
// Capture screenshot
filePath, err := a.capturer.Get()
if err != nil {
a.log.Error("Failed to capture screenshot", "error", err)
a.log.Error("failed to obtain screenshot from capturer", "error", err)
a.addConsoleOutput("Error: Failed to capture screenshot")
a.stats.Status = Waiting
return

View File

@@ -57,7 +57,11 @@ type wholeScreenCapturer struct {
// Get implements ScreenCapturer.
func (w *wholeScreenCapturer) Get() (filepath string, err error) {
if !w.initialized {
w.mu.RLock()
initialized := w.initialized
w.mu.RUnlock()
if !initialized {
return "", ErrNotInitialized
}
@@ -73,6 +77,9 @@ func (w *wholeScreenCapturer) Get() (filepath string, err error) {
// Init implements ScreenCapturer.
func (w *wholeScreenCapturer) Init() (err error) {
w.mu.Lock()
defer w.mu.Unlock()
if w.initialized {
w.log.Debug("wholescreencapturer already initialized, skipping initialization")
return nil
@@ -104,6 +111,7 @@ func (w *wholeScreenCapturer) Init() (err error) {
}
func (w *wholeScreenCapturer) captureAndSave() (string, error) {
w.mu.RLock()
img, err := screenshot.CaptureRect(w.displayBounds)
if err != nil {
w.log.Error("failed to capture screenshot", "error", err)
@@ -113,6 +121,7 @@ func (w *wholeScreenCapturer) captureAndSave() (string, error) {
now := time.Now().UnixMilli()
filename := fmt.Sprintf("%d.png", now)
filePath := filepath.Join(w.tempDirectory, filename)
w.mu.RUnlock()
file, err := os.Create(filePath)
if err != nil {
@@ -159,7 +168,11 @@ func NewWholeScreenCapturer(
log: log,
}
lc.Append(fx.StopHook(func(ctx context.Context) error {
if !capturer.initialized {
capturer.mu.RLock()
initialized := capturer.initialized
capturer.mu.RUnlock()
if !initialized {
log.Debug("wholescreencapturer not initialized, nothing to do")
return nil
}