cairde/cmd/cairde/main.go

135 lines
2.8 KiB
Go

// Package main is the command-line entrypoint.
package main
import (
"flag"
"fmt"
"log"
"os"
"os/exec"
"os/user"
"path"
"d1.hackers.moe/cairde/ui"
openPrivacyLog "git.openprivacy.ca/openprivacy/log"
_ "github.com/mutecomm/go-sqlcipher/v4"
tea "github.com/charmbracelet/bubbletea"
)
var (
// Version is the current version of Cairde (LDFLAGS).
Version string
// Commit is the current git commit of Cairde (LDFLAGS).
Commit string
// help is the command-line help output.
help = `cairde [options]
_________ ________ ____ ______
/ ____/ | / _/ __ \/ __ \/ ____/
/ / / /| | / // /_/ / / / / __/
/ /___/ ___ |_/ // _, _/ /_/ / /___
\____/_/ |_/___/_/ |_/_____/_____/
Metadata resistant messaging
%s
Options:
-a turn on the Tor ACN immediately
-d turn on debug logging
-v output version
-h output help
`
)
func main() {
if Version == "" {
Version = "pre-alpha"
}
if Commit == "" {
Commit = " "
}
cairdeVersion := fmt.Sprintf("%s commit %s", Version, Commit[:7])
var (
acnFlag bool
debugFlag bool
versionFlag bool
helpFlag bool
)
flag.BoolVar(&helpFlag, "h", false, "output help")
flag.BoolVar(&acnFlag, "a", false, "turn on the Tor ACN immediately")
flag.BoolVar(&debugFlag, "d", false, "turn on debug logging")
flag.BoolVar(&versionFlag, "v", false, "output version")
flag.Parse()
if helpFlag {
fmt.Print(fmt.Sprintf(help, cairdeVersion))
os.Exit(0)
}
if versionFlag {
fmt.Printf("%s\n", cairdeVersion)
os.Exit(0)
}
_, err := exec.LookPath("tor")
// NOTE(d1): pending https://git.coopcloud.tech/decentral1se/cairde/issues/1
if err != nil {
log.Fatal("main: could not find 'tor' command, is it installed?")
}
user, err := user.Current()
if err != nil {
log.Fatalf("main: unable to determine current user: %s", err)
}
cairdeHomeDir := path.Join(user.HomeDir, ".cairde")
cairdeLogsDir := path.Join(cairdeHomeDir, "logs")
for _, baseDir := range []string{cairdeHomeDir, cairdeLogsDir} {
if err := os.Mkdir(baseDir, 0760); err != nil {
if !os.IsExist(err) {
log.Fatalf("main: unable to create directory %s: %s", baseDir, err)
}
}
}
cairdeLogPath := path.Join(cairdeLogsDir, "cairde.log")
f, err := tea.LogToFile(cairdeLogPath, "debug")
if err != nil {
log.Fatal(err)
}
defer f.Close()
cwtchLogPath := path.Join(cairdeLogsDir, "cwtch.log")
filelogger, err := openPrivacyLog.NewFile(openPrivacyLog.LevelInfo, cwtchLogPath)
if err == nil {
openPrivacyLog.SetStd(filelogger)
}
p := tea.NewProgram(
ui.NewModel(
user.Username,
user.HomeDir,
cairdeVersion,
debugFlag,
),
tea.WithAltScreen(),
tea.WithMouseAllMotion(),
)
if acnFlag {
go func() {
p.Send(ui.AcnOnMsg{})
}()
}
if _, err := p.Run(); err != nil {
log.Fatal(err)
}
}