2023-12-12 20:59:54 +01:00
|
|
|
package cmd
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
2023-12-16 23:17:23 +01:00
|
|
|
"github.com/eiannone/keyboard"
|
2023-12-12 20:59:54 +01:00
|
|
|
"sync"
|
2023-12-16 20:52:05 +01:00
|
|
|
"time"
|
2023-12-12 20:59:54 +01:00
|
|
|
)
|
|
|
|
|
|
2023-12-16 20:52:05 +01:00
|
|
|
type Log struct {
|
2023-12-16 23:17:23 +01:00
|
|
|
Level string
|
2023-12-16 20:52:05 +01:00
|
|
|
Message string
|
2023-12-16 23:17:23 +01:00
|
|
|
Time string
|
|
|
|
|
Source string
|
2023-12-16 20:52:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type LoggerQueue struct {
|
2023-12-16 23:17:23 +01:00
|
|
|
queue chan Log
|
|
|
|
|
currentInput string
|
2023-12-16 20:52:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var Logger = &LoggerQueue{
|
|
|
|
|
queue: make(chan Log, 100),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (l *LoggerQueue) log(level string, message string, source string) {
|
|
|
|
|
l.queue <- Log{
|
|
|
|
|
Level: level,
|
|
|
|
|
Message: message,
|
|
|
|
|
Time: time.Now().Format("2006/01/02 15:04:05"),
|
|
|
|
|
Source: source,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (l *LoggerQueue) Info(message string) {
|
|
|
|
|
l.log("INFO", message, "")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (l *LoggerQueue) Warning(message string) {
|
|
|
|
|
l.log("WARNING", message, "")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (l *LoggerQueue) Error(message string) {
|
|
|
|
|
l.log("ERROR", message, "")
|
|
|
|
|
}
|
|
|
|
|
|
2023-12-16 23:17:23 +01:00
|
|
|
func (l *LoggerQueue) processLogs(stopChan chan struct{}) {
|
|
|
|
|
ticker := time.NewTicker(100 * time.Millisecond)
|
|
|
|
|
defer ticker.Stop()
|
|
|
|
|
|
|
|
|
|
for {
|
|
|
|
|
select {
|
|
|
|
|
case logEntry := <-l.queue:
|
|
|
|
|
displayLog(logEntry)
|
|
|
|
|
case <-stopChan:
|
|
|
|
|
fmt.Print("\033[2K\r")
|
|
|
|
|
println("Stopping")
|
|
|
|
|
return
|
|
|
|
|
case <-ticker.C:
|
|
|
|
|
refreshInputDisplay(l.currentInput)
|
|
|
|
|
}
|
2023-12-16 20:52:05 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-12-16 23:17:23 +01:00
|
|
|
func displayLog(logEntry Log) {
|
|
|
|
|
fmt.Printf("\033[2K\r%s [%s]: %s\n", logEntry.Time, logEntry.Level, logEntry.Message)
|
|
|
|
|
fmt.Print("> ")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func refreshInputDisplay(input string) {
|
|
|
|
|
fmt.Print("\033[2K\r> " + input)
|
|
|
|
|
}
|
|
|
|
|
|
2023-12-12 20:59:54 +01:00
|
|
|
func Start(wg *sync.WaitGroup, stopChan chan struct{}) {
|
|
|
|
|
defer wg.Done()
|
|
|
|
|
|
2023-12-16 23:17:23 +01:00
|
|
|
if err := keyboard.Open(); err != nil {
|
|
|
|
|
panic(err)
|
|
|
|
|
}
|
|
|
|
|
defer func() {
|
|
|
|
|
go keyboard.Close()
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
go Logger.processLogs(stopChan)
|
2023-12-16 20:52:05 +01:00
|
|
|
|
2023-12-16 23:17:23 +01:00
|
|
|
input := ""
|
2023-12-12 20:59:54 +01:00
|
|
|
for {
|
2023-12-16 23:17:23 +01:00
|
|
|
char, key, err := keyboard.GetKey()
|
2023-12-12 20:59:54 +01:00
|
|
|
if err != nil {
|
2023-12-16 23:17:23 +01:00
|
|
|
Logger.Error(fmt.Sprintf("Keyboard error: %v", err))
|
|
|
|
|
break
|
2023-12-12 20:59:54 +01:00
|
|
|
}
|
|
|
|
|
|
2023-12-16 23:17:23 +01:00
|
|
|
switch {
|
|
|
|
|
case key == keyboard.KeyEnter:
|
|
|
|
|
switch input {
|
|
|
|
|
case "":
|
|
|
|
|
// Do nothing
|
|
|
|
|
case "stop":
|
|
|
|
|
Logger.Info("Received stop command.")
|
|
|
|
|
close(stopChan)
|
|
|
|
|
return
|
|
|
|
|
default:
|
|
|
|
|
Logger.Info(fmt.Sprintf("Unknown command: %s", input))
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
input = ""
|
|
|
|
|
case key == keyboard.KeyBackspace || key == keyboard.KeyBackspace2:
|
|
|
|
|
if len(input) > 0 {
|
|
|
|
|
input = input[:len(input)-1]
|
|
|
|
|
}
|
|
|
|
|
case key == keyboard.KeySpace:
|
|
|
|
|
input += " "
|
|
|
|
|
case key == keyboard.KeyCtrlC:
|
2023-12-16 20:52:05 +01:00
|
|
|
Logger.Info("Received stop command.")
|
2023-12-12 20:59:54 +01:00
|
|
|
close(stopChan)
|
|
|
|
|
return
|
2023-12-16 23:17:23 +01:00
|
|
|
case char != 0:
|
|
|
|
|
input += string(char)
|
2023-12-12 20:59:54 +01:00
|
|
|
}
|
2023-12-16 23:17:23 +01:00
|
|
|
Logger.currentInput = input // Update stored user input
|
2023-12-12 20:59:54 +01:00
|
|
|
}
|
|
|
|
|
}
|