Compare commits
8 Commits
c2a0189951
...
20b6841043
| Author | SHA1 | Date | |
|---|---|---|---|
| 20b6841043 | |||
| f1d7cf656c | |||
| a76be07298 | |||
| 8e55175ff1 | |||
| ef5671d8ed | |||
| 4dbf40c4a0 | |||
| 050fae6fd2 | |||
| df689a3eb7 |
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
APP_NAME := autoattendance
|
||||
SRC_DIR := ./
|
||||
BUILD_DIR := bin
|
||||
CMD_PATH := ./cmd
|
||||
CMD_PATH := ./cmd/qrminator-cli/
|
||||
|
||||
GOCMD := go
|
||||
GOBUILD := $(GOCMD) build -v
|
||||
|
||||
14
README.md
14
README.md
@@ -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`. Необходимо получить актуальный файл конфигурации, который будет работать с конкретным журналом посещений
|
||||
|
||||
## 🔨 Сборка
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user