diff options
author | Hubert Hirtz <hubert@hirtzfr.eu> | 2020-08-05 13:11:56 +0200 |
---|---|---|
committer | Hubert Hirtz <hubert@hirtzfr.eu> | 2020-08-05 13:11:56 +0200 |
commit | 547b5f1bb9864897f63efb14c0b8479b03fb050d (patch) | |
tree | ac66cf060e4f14ab7277aa5815c847ea03a1dc98 /cmd | |
parent | Accept a -config command-line argument (diff) |
Configurable highlights
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/irc/main.go | 256 |
1 files changed, 2 insertions, 254 deletions
diff --git a/cmd/irc/main.go b/cmd/irc/main.go index b2b0705..cd9c263 100644 --- a/cmd/irc/main.go +++ b/cmd/irc/main.go @@ -1,18 +1,13 @@ package main import ( - "crypto/tls" "flag" - "fmt" "log" "math/rand" "os" - "strings" "time" "git.sr.ht/~taiite/senpai" - "git.sr.ht/~taiite/senpai/irc" - "git.sr.ht/~taiite/senpai/ui" "github.com/gdamore/tcell" ) @@ -40,258 +35,11 @@ func main() { log.Panicln(err) } - app, err := ui.New() + app, err := senpai.NewApp(cfg) if err != nil { log.Panicln(err) } defer app.Close() - addr := cfg.Addr - app.AddLine(ui.Home, ui.NewLineNow("--", fmt.Sprintf("Connecting to %s...", addr)), false) - - conn, err := tls.Dial("tcp", addr, nil) - if err != nil { - log.Panicln(err) - } - - var auth irc.SASLClient - if cfg.Password != "" { - auth = &irc.SASLPlain{Username: cfg.User, Password: cfg.Password} - } - s, err := irc.NewSession(conn, irc.SessionParams{ - Nickname: cfg.Nick, - Username: cfg.User, - RealName: cfg.Real, - Auth: auth, - }) - if err != nil { - log.Panicln(err) - } - defer s.Stop() - - for !app.ShouldExit() { - select { - case ev := <-s.Poll(): - handleIRCEvent(app, &s, ev) - case ev := <-app.Events: - handleUIEvent(app, &s, ev) - } - } -} - -func handleIRCEvent(app *ui.UI, s *irc.Session, ev irc.Event) { - switch ev := ev.(type) { - case irc.RegisteredEvent: - app.AddLine("", ui.NewLineNow("--", "Connected to the server"), false) - case irc.SelfJoinEvent: - app.AddBuffer(ev.Channel) - case irc.UserJoinEvent: - line := fmt.Sprintf("\x033+\x0314%s", ev.Nick) - app.AddLine(ev.Channel, ui.NewLine(ev.Time, "--", line, true), false) - case irc.SelfPartEvent: - app.RemoveBuffer(ev.Channel) - case irc.UserPartEvent: - line := fmt.Sprintf("\x034-\x0314%s", ev.Nick) - app.AddLine(ev.Channel, ui.NewLine(ev.Time, "--", line, true), false) - case irc.QueryMessageEvent: - if ev.Command == "PRIVMSG" { - l := ui.LineFromIRCMessage(ev.Time, ev.Nick, ev.Content, false) - app.AddLine(ui.Home, l, true) - app.TypingStop(ui.Home, ev.Nick) - } else if ev.Command == "NOTICE" { - l := ui.LineFromIRCMessage(ev.Time, ev.Nick, ev.Content, true) - app.AddLine("", l, true) - app.TypingStop("", ev.Nick) - } else { - panic("unknown command") - } - case irc.ChannelMessageEvent: - l := ui.LineFromIRCMessage(ev.Time, ev.Nick, ev.Content, ev.Command == "NOTICE") - isHighlight := strings.Contains(strings.ToLower(ev.Content), strings.ToLower(s.Nick())) - app.AddLine(ev.Channel, l, isHighlight) - app.TypingStop(ev.Channel, ev.Nick) - case irc.QueryTypingEvent: - if ev.State == 1 || ev.State == 2 { - app.TypingStart(ui.Home, ev.Nick) - } else { - app.TypingStop(ui.Home, ev.Nick) - } - case irc.ChannelTypingEvent: - if ev.State == 1 || ev.State == 2 { - app.TypingStart(ev.Channel, ev.Nick) - } else { - app.TypingStop(ev.Channel, ev.Nick) - } - case irc.HistoryEvent: - var lines []ui.Line - for _, m := range ev.Messages { - switch m := m.(type) { - case irc.ChannelMessageEvent: - l := ui.LineFromIRCMessage(m.Time, m.Nick, m.Content, m.Command == "NOTICE") - lines = append(lines, l) - default: - panic("TODO") - } - } - app.AddLines(ev.Target, lines) - case error: - log.Panicln(ev) - } -} - -func handleUIEvent(app *ui.UI, s *irc.Session, ev tcell.Event) { - switch ev := ev.(type) { - case *tcell.EventResize: - app.Resize() - case *tcell.EventKey: - switch ev.Key() { - case tcell.KeyCtrlC: - app.Exit() - case tcell.KeyCtrlL: - app.Resize() - case tcell.KeyCtrlU, tcell.KeyPgUp: - app.ScrollUp() - if app.IsAtTop() { - buffer := app.CurrentBuffer() - at := time.Now() - if t := app.CurrentBufferOldestTime(); t != nil { - at = *t - } - s.RequestHistory(buffer, at) - } - case tcell.KeyCtrlD, tcell.KeyPgDn: - app.ScrollDown() - case tcell.KeyCtrlN: - app.NextBuffer() - if app.IsAtTop() { - buffer := app.CurrentBuffer() - at := time.Now() - if t := app.CurrentBufferOldestTime(); t != nil { - at = *t - } - s.RequestHistory(buffer, at) - } - case tcell.KeyCtrlP: - app.PreviousBuffer() - if app.IsAtTop() { - buffer := app.CurrentBuffer() - at := time.Now() - if t := app.CurrentBufferOldestTime(); t != nil { - at = *t - } - s.RequestHistory(buffer, at) - } - case tcell.KeyRight: - if ev.Modifiers() == tcell.ModAlt { - app.NextBuffer() - if app.IsAtTop() { - buffer := app.CurrentBuffer() - at := time.Now() - if t := app.CurrentBufferOldestTime(); t != nil { - at = *t - } - s.RequestHistory(buffer, at) - } - } else { - app.InputRight() - } - case tcell.KeyLeft: - if ev.Modifiers() == tcell.ModAlt { - app.PreviousBuffer() - if app.IsAtTop() { - buffer := app.CurrentBuffer() - at := time.Now() - if t := app.CurrentBufferOldestTime(); t != nil { - at = *t - } - s.RequestHistory(buffer, at) - } - } else { - app.InputLeft() - } - case tcell.KeyBackspace2: - ok := app.InputBackspace() - if ok && app.InputLen() == 0 { - s.TypingStop(app.CurrentBuffer()) - } - case tcell.KeyEnter: - buffer := app.CurrentBuffer() - input := app.InputEnter() - handleInput(app, s, buffer, input) - case tcell.KeyRune: - app.InputRune(ev.Rune()) - if app.CurrentBuffer() != ui.Home && !app.InputIsCommand() { - s.Typing(app.CurrentBuffer()) - } - } - } -} - -func parseCommand(s string) (command, args string) { - if s == "" { - return - } - - if s[0] != '/' { - args = s - return - } - - i := strings.IndexByte(s, ' ') - if i < 0 { - i = len(s) - } - - command = strings.ToUpper(s[1:i]) - args = strings.TrimLeft(s[i:], " ") - - return -} - -func handleInput(app *ui.UI, s *irc.Session, buffer, content string) { - cmd, args := parseCommand(content) - - switch cmd { - case "": - if buffer == ui.Home || len(strings.TrimSpace(args)) == 0 { - return - } - - s.PrivMsg(buffer, args) - if !s.HasCapability("echo-message") { - app.AddLine(buffer, ui.NewLineNow(s.Nick(), args), false) - } - case "QUOTE": - s.SendRaw(args) - case "J", "JOIN": - s.Join(args) - case "PART": - if buffer == ui.Home { - return - } - - if args == "" { - args = buffer - } - - s.Part(args) - case "ME": - if buffer == ui.Home { - return - } - - line := fmt.Sprintf("\x01ACTION %s\x01", args) - s.PrivMsg(buffer, line) - // TODO echo message - case "MSG": - split := strings.SplitN(args, " ", 2) - if len(split) < 2 { - return - } - - target := split[0] - content := split[1] - s.PrivMsg(target, content) - // TODO echo mssage - } + app.Run() } |