From 4efc3b6667bbbf219a8e2f833836ba5d5d1dfac3 Mon Sep 17 00:00:00 2001 From: d3m0k1d Date: Mon, 5 Jan 2026 17:12:01 +0300 Subject: [PATCH] Recode parser logic --- internal/parser/parser.go | 70 +++++++++++++++++++++++++++++++++------ 1 file changed, 59 insertions(+), 11 deletions(-) diff --git a/internal/parser/parser.go b/internal/parser/parser.go index d9f6ce3..e205ded 100644 --- a/internal/parser/parser.go +++ b/internal/parser/parser.go @@ -2,27 +2,75 @@ package parser import ( "bufio" - "github.com/d3m0k1d/BanForge/internal/logger" "os" + "time" + + "github.com/d3m0k1d/BanForge/internal/logger" ) type Event struct { Data string } -type Scaner struct { - scanner *bufio.Scanner - ch chan Event +type Scanner struct { + scanner *bufio.Scanner + ch chan Event + stopCh chan struct{} + logger *logger.Logger + file *os.File + pollDelay time.Duration } -func CreateScaner(path string) *Scaner { - log := logger.New(false) +func NewScanner(path string) (*Scanner, error) { file, err := os.Open(path) if err != nil { - log.Error(err.Error()) - } - return &Scaner{ - scanner: bufio.NewScanner(file), - ch: make(chan Event), + return nil, err } + + return &Scanner{ + scanner: bufio.NewScanner(file), + ch: make(chan Event, 100), + stopCh: make(chan struct{}), + logger: logger.New(false), + file: file, + pollDelay: 100 * time.Millisecond, + }, nil +} + +func (s *Scanner) Start() { + s.logger.Info("Scanner started") + + go func() { + for { + select { + case <-s.stopCh: + s.logger.Info("Scanner stopped") + return + + default: + if s.scanner.Scan() { + s.ch <- Event{ + Data: s.scanner.Text(), + } + } else { + if err := s.scanner.Err(); err != nil { + s.logger.Error("Scanner error:", err) + return + } + time.Sleep(s.pollDelay) + } + } + } + }() +} + +func (s *Scanner) Stop() { + close(s.stopCh) + time.Sleep(150 * time.Millisecond) + s.file.Close() + close(s.ch) +} + +func (s *Scanner) Events() <-chan Event { + return s.ch }