diff --git a/main.go b/main.go index a63e05e..e867736 100644 --- a/main.go +++ b/main.go @@ -485,21 +485,14 @@ func handleConn(conn net.Conn) { client.fwrite(":server 303 %s :%s\r\n", client.nick, strings.Join(online, " ")) // ircv3 stuff case "CHATHISTORY": + if len(msg.Params) < 1 { + client.fwrite(":server 461 %s CHATHISTORY :Not enough parameters\r\n", client.nick) + continue + } subcmd := strings.ToUpper(msg.Params[0]) - if subcmd == "LATEST" { - if len(msg.Params) < 3 { - client.fwrite(":server 461 %s CHATHISTORY :Not enough parameters\r\n", client.nick) - continue - } - target := historyTargetName(msg.Params[1]) - count, convErr := strconv.Atoi(msg.Params[2]) - if convErr != nil || count <= 0 { - client.fwrite(":server 461 %s CHATHISTORY :Invalid message count\r\n", client.nick) - continue - } - client.serveHistory(subcmd, target, count, msg.Params) - } else { + switch subcmd { + case "LATEST", "BEFORE", "AFTER", "AROUND": if len(msg.Params) < 4 { client.fwrite(":server 461 %s CHATHISTORY :Not enough parameters\r\n", client.nick) continue @@ -511,9 +504,37 @@ func handleConn(conn net.Conn) { continue } client.serveHistory(subcmd, target, count, msg.Params) + + case "BETWEEN": + if len(msg.Params) < 5 { + client.fwrite(":server 461 %s CHATHISTORY :Not enough parameters\r\n", client.nick) + continue + } + target := historyTargetName(msg.Params[1]) + count, convErr := strconv.Atoi(msg.Params[4]) + if convErr != nil || count <= 0 { + client.fwrite(":server 461 %s CHATHISTORY :Invalid message count\r\n", client.nick) + continue + } + client.serveHistory(subcmd, target, count, msg.Params) + + case "TARGETS": + if len(msg.Params) < 4 { + client.fwrite(":server 461 %s CHATHISTORY :Not enough parameters\r\n", client.nick) + continue + } + count, convErr := strconv.Atoi(msg.Params[3]) + if convErr != nil || count <= 0 { + client.fwrite(":server 461 %s CHATHISTORY :Invalid message count\r\n", client.nick) + continue + } + client.serveHistory(subcmd, "", count, msg.Params) + + default: + client.fwrite(":server 400 %s CHATHISTORY :Unknown subcommand\r\n", client.nick) } - case "MONITOR": + case "MONITOR": if len(msg.Params) < 1 { client.fwrite(":server 461 %s MONITOR :Not enough parameters\r\n", client.nick) continue @@ -644,6 +665,24 @@ func (c *Client) serveHistory(subcmd, target string, count int, params []string) } defer rows.Close() msgs = scanRows(rows, target) + case "BETWEEN": + if len(params) < 5 { + c.fwrite(":server 461 %s CHATHISTORY :Not enough parameters\r\n", c.nick) + return + } + start := strings.TrimPrefix(params[2], "msgid=") + end := strings.TrimPrefix(params[3], "msgid=") + rows, err := db.Query(`SELECT msgid, timestamp, prefix, command, msg + FROM messages + WHERE channel=? AND msgid BETWEEN ? AND ? + ORDER BY timestamp ASC LIMIT ?`, + target, start, end, count) + if err != nil { + c.fwrite(":server 718 %s %s :No history available\r\n", c.nick, target) + return + } + defer rows.Close() + msgs = scanRows(rows, target) case "AFTER": if len(params) < 4 {