diff --git a/internal/bot/handler.go b/internal/bot/handler.go index b7eb5d9..f307cf0 100644 --- a/internal/bot/handler.go +++ b/internal/bot/handler.go @@ -4,6 +4,8 @@ import ( "log" "strings" + "git.aiterp.net/rpdata/logbot3/internal/util" + "git.aiterp.net/gisle/irc" "git.aiterp.net/rpdata/logbot3/internal/config" ) @@ -50,10 +52,12 @@ func handler(event *irc.Event, client *irc.Client) { case "ctcp.action", "packet.privmsg": { + // The echo-message polyfill will return to sender. if event.Nick == bot.client.Nick() { break } + // Only continue with channel messages, but log the others. channel := event.ChannelTarget() if channel == nil { if event.Verb() == "action" { @@ -65,31 +69,38 @@ func handler(event *irc.Event, client *irc.Client) { break } + // Parse account, just in case it'll be useful one day. account := "" if user, ok := bot.client.FindUser(event.Nick); ok { account = user.Account } + // Get the kind of psot this is. kind := "" - if event.Verb() == "action" { + if strings.HasPrefix(event.Nick, "=") || strings.HasPrefix(event.Nick, "\x1F=") { + kind = "scene" + } else if strings.ToLower(event.Verb()) == "action" { kind = "action" } else { - if strings.HasPrefix(event.Nick, "=") { - kind = "scene" - } else { - kind = "text" - } + kind = "text" } - post := ChannelPost{ + // Format NPC posts' nick and text. + nick := event.Nick + text := event.Text + if strings.HasPrefix(event.Nick, "\x1F") || kind == "scene" { + nick = strings.Replace(event.Nick, "\x1F", "", 2) + text = util.RemoveNPCAttribution(event.Text) + } + + // Dispatch it. + bot.handlePost(channel.Name(), ChannelPost{ Account: account, Kind: kind, - Nick: event.Nick, + Nick: nick, Time: event.Time, - Text: event.Text, - } - - bot.handlePost(channel.Name(), post) + Text: text, + }) } // Log notices diff --git a/internal/util/npc.go b/internal/util/npc.go new file mode 100644 index 0000000..c1181ce --- /dev/null +++ b/internal/util/npc.go @@ -0,0 +1,23 @@ +package util + +import ( + "strings" +) + +// RemoveNPCAttribution removes NPC attribution. +func RemoveNPCAttribution(str string) string { + lastOpen := strings.LastIndex(str, "(") + lastClose := strings.LastIndex(str, ")") + ending := len(str) - 1 + + if lastOpen > 0 && str[lastOpen-1] != '(' && (lastClose == -1 || lastClose == ending) { + cutoff := lastOpen + for cutoff > 1 && str[cutoff-1] == ' ' { + cutoff-- + } + + return str[:cutoff] + } + + return str +} diff --git a/internal/util/npc_test.go b/internal/util/npc_test.go new file mode 100644 index 0000000..1190f95 --- /dev/null +++ b/internal/util/npc_test.go @@ -0,0 +1,44 @@ +package util_test + +import ( + "fmt" + "testing" + + "git.aiterp.net/rpdata/logbot3/internal/util" +) + +func TestRemoveNPCAttribution(t *testing.T) { + table := []struct { + Input string + Output string + }{ + { + Input: "Character does stuff. (Player_Name)", + Output: "Character does stuff.", + }, + { + Input: "Text (with some clarification) about stuff.", + Output: "Text (with some clarification) about stuff.", + }, + { + Input: "Text without anything.", + Output: "Text without anything.", + }, + { + Input: "((*Correction))", + Output: "((*Correction))", + }, + } + + for i, row := range table { + t.Run(fmt.Sprintf("Row_%d", i), func(t *testing.T) { + result := util.RemoveNPCAttribution(row.Input) + + if result != row.Output { + t.Errorf("Row %d failed", i) + t.Errorf("Expected: %#+v", row.Output) + t.Errorf("Result: %#+v", result) + } + }) + } +}