forked from External/ergo
implement CHATHISTORY TARGETS
This commit is contained in:
parent
4052cd12fe
commit
18b6e2f1cd
9 changed files with 248 additions and 78 deletions
|
|
@ -570,25 +570,25 @@ func chathistoryHandler(server *Server, client *Client, msg ircmsg.Message, rb *
|
|||
var channel *Channel
|
||||
var sequence history.Sequence
|
||||
var err error
|
||||
var listCorrespondents bool
|
||||
var correspondents []history.CorrespondentListing
|
||||
var listTargets bool
|
||||
var targets []history.TargetListing
|
||||
defer func() {
|
||||
// errors are sent either without a batch, or in a draft/labeled-response batch as usual
|
||||
if err == utils.ErrInvalidParams {
|
||||
rb.Add(nil, server.name, "FAIL", "CHATHISTORY", "INVALID_PARAMS", msg.Params[0], client.t("Invalid parameters"))
|
||||
} else if sequence == nil {
|
||||
} else if !listTargets && sequence == nil {
|
||||
rb.Add(nil, server.name, "FAIL", "CHATHISTORY", "INVALID_TARGET", utils.SafeErrorParam(target), client.t("Messages could not be retrieved"))
|
||||
} else if err != nil {
|
||||
rb.Add(nil, server.name, "FAIL", "CHATHISTORY", "MESSAGE_ERROR", msg.Params[0], client.t("Messages could not be retrieved"))
|
||||
} else {
|
||||
// successful responses are sent as a chathistory or history batch
|
||||
if listCorrespondents {
|
||||
batchID := rb.StartNestedBatch("draft/chathistory-listcorrespondents")
|
||||
if listTargets {
|
||||
batchID := rb.StartNestedBatch("draft/chathistory-targets")
|
||||
defer rb.EndNestedBatch(batchID)
|
||||
for _, correspondent := range correspondents {
|
||||
nick := server.clients.UnfoldNick(correspondent.CfCorrespondent)
|
||||
rb.Add(nil, server.name, "CHATHISTORY", "CORRESPONDENT", nick,
|
||||
correspondent.Time.Format(IRCv3TimestampFormat))
|
||||
for _, target := range targets {
|
||||
name := server.UnfoldName(target.CfName)
|
||||
rb.Add(nil, server.name, "CHATHISTORY", "TARGETS", name,
|
||||
target.Time.Format(IRCv3TimestampFormat))
|
||||
}
|
||||
} else if channel != nil {
|
||||
channel.replayHistoryItems(rb, items, false)
|
||||
|
|
@ -605,9 +605,7 @@ func chathistoryHandler(server *Server, client *Client, msg ircmsg.Message, rb *
|
|||
}
|
||||
preposition := strings.ToLower(msg.Params[0])
|
||||
target = msg.Params[1]
|
||||
if preposition == "listcorrespondents" {
|
||||
target = "*"
|
||||
}
|
||||
listTargets = (preposition == "targets")
|
||||
|
||||
parseQueryParam := func(param string) (msgid string, timestamp time.Time, err error) {
|
||||
if param == "*" && (preposition == "before" || preposition == "between") {
|
||||
|
|
@ -642,11 +640,6 @@ func chathistoryHandler(server *Server, client *Client, msg ircmsg.Message, rb *
|
|||
return
|
||||
}
|
||||
|
||||
channel, sequence, err = server.GetHistorySequence(nil, client, target)
|
||||
if err != nil || sequence == nil {
|
||||
return
|
||||
}
|
||||
|
||||
roundUp := func(endpoint time.Time) (result time.Time) {
|
||||
return endpoint.Truncate(time.Millisecond).Add(time.Millisecond)
|
||||
}
|
||||
|
|
@ -655,8 +648,7 @@ func chathistoryHandler(server *Server, client *Client, msg ircmsg.Message, rb *
|
|||
var start, end history.Selector
|
||||
var limit int
|
||||
switch preposition {
|
||||
case "listcorrespondents":
|
||||
listCorrespondents = true
|
||||
case "targets":
|
||||
// use the same selector parsing as BETWEEN,
|
||||
// except that we have no target so we have one fewer parameter
|
||||
paramPos = 1
|
||||
|
|
@ -710,12 +702,18 @@ func chathistoryHandler(server *Server, client *Client, msg ircmsg.Message, rb *
|
|||
return
|
||||
}
|
||||
|
||||
if listCorrespondents {
|
||||
correspondents, err = sequence.ListCorrespondents(start, end, limit)
|
||||
} else if preposition == "around" {
|
||||
items, err = sequence.Around(start, limit)
|
||||
if listTargets {
|
||||
targets, err = client.listTargets(start, end, limit)
|
||||
} else {
|
||||
items, err = sequence.Between(start, end, limit)
|
||||
channel, sequence, err = server.GetHistorySequence(nil, client, target)
|
||||
if err != nil || sequence == nil {
|
||||
return
|
||||
}
|
||||
if preposition == "around" {
|
||||
items, err = sequence.Around(start, limit)
|
||||
} else {
|
||||
items, err = sequence.Between(start, end, limit)
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue