3
0
mirror of https://github.com/ergochat/ergo.git synced 2024-11-13 07:29:30 +01:00

Merge pull request #557 from slingamn/issue555.2

upgrade to draft/labeled-response-0.2
This commit is contained in:
Daniel Oaks 2019-06-28 22:18:42 +10:00 committed by GitHub
commit a5d09c932c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 28 additions and 24 deletions

View File

@ -77,7 +77,7 @@ CAPDEFS = [
), ),
CapDef( CapDef(
identifier="LabeledResponse", identifier="LabeledResponse",
name="draft/labeled-response", name="draft/labeled-response-0.2",
url="https://ircv3.net/specs/extensions/labeled-response.html", url="https://ircv3.net/specs/extensions/labeled-response.html",
standard="draft IRCv3", standard="draft IRCv3",
), ),

View File

@ -53,7 +53,7 @@ const (
// https://ircv3.net/specs/extensions/invite-notify-3.2.html // https://ircv3.net/specs/extensions/invite-notify-3.2.html
InviteNotify Capability = iota InviteNotify Capability = iota
// LabeledResponse is the draft IRCv3 capability named "draft/labeled-response": // LabeledResponse is the draft IRCv3 capability named "draft/labeled-response-0.2":
// https://ircv3.net/specs/extensions/labeled-response.html // https://ircv3.net/specs/extensions/labeled-response.html
LabeledResponse Capability = iota LabeledResponse Capability = iota
@ -135,7 +135,7 @@ var (
"echo-message", "echo-message",
"extended-join", "extended-join",
"invite-notify", "invite-notify",
"draft/labeled-response", "draft/labeled-response-0.2",
"draft/languages", "draft/languages",
"oragono.io/maxline-2", "oragono.io/maxline-2",
"message-tags", "message-tags",

View File

@ -1160,12 +1160,7 @@ func (session *Session) sendFromClientInternal(blocking bool, serverTime time.Ti
msg.SetTag("msgid", msgid) msg.SetTag("msgid", msgid)
} }
// attach server-time // attach server-time
if session.capabilities.Has(caps.ServerTime) { session.setTimeTag(&msg, serverTime)
if serverTime.IsZero() {
serverTime = time.Now().UTC()
}
msg.SetTag("time", serverTime.Format(IRCv3TimestampFormat))
}
return session.SendRawMessage(msg, blocking) return session.SendRawMessage(msg, blocking)
} }
@ -1246,12 +1241,19 @@ func (client *Client) Send(tags map[string]string, prefix string, command string
func (session *Session) Send(tags map[string]string, prefix string, command string, params ...string) (err error) { func (session *Session) Send(tags map[string]string, prefix string, command string, params ...string) (err error) {
msg := ircmsg.MakeMessage(tags, prefix, command, params...) msg := ircmsg.MakeMessage(tags, prefix, command, params...)
if session.capabilities.Has(caps.ServerTime) && !msg.HasTag("time") { session.setTimeTag(&msg, time.Time{})
msg.SetTag("time", time.Now().UTC().Format(IRCv3TimestampFormat))
}
return session.SendRawMessage(msg, false) return session.SendRawMessage(msg, false)
} }
func (session *Session) setTimeTag(msg *ircmsg.IrcMessage, serverTime time.Time) {
if session.capabilities.Has(caps.ServerTime) && !msg.HasTag("time") {
if serverTime.IsZero() {
serverTime = time.Now()
}
msg.SetTag("time", serverTime.UTC().Format(IRCv3TimestampFormat))
}
}
// Notice sends the client a notice from the server. // Notice sends the client a notice from the server.
func (client *Client) Notice(text string) { func (client *Client) Notice(text string) {
client.Send(nil, client.server.name, "NOTICE", client.Nick(), text) client.Send(nil, client.server.name, "NOTICE", client.Nick(), text)

View File

@ -93,9 +93,7 @@ func (rb *ResponseBuffer) AddFromClient(time time.Time, msgid string, fromNickMa
msg.SetTag("msgid", msgid) msg.SetTag("msgid", msgid)
} }
// attach server-time // attach server-time
if rb.session.capabilities.Has(caps.ServerTime) && !msg.HasTag("time") { rb.session.setTimeTag(&msg, time)
msg.SetTag("time", time.UTC().Format(IRCv3TimestampFormat))
}
rb.AddMessage(msg) rb.AddMessage(msg)
} }
@ -212,24 +210,28 @@ func (rb *ResponseBuffer) flushInternal(final bool, blocking bool) error {
} }
useLabel := rb.session.capabilities.Has(caps.LabeledResponse) && rb.Label != "" useLabel := rb.session.capabilities.Has(caps.LabeledResponse) && rb.Label != ""
// use a batch if we have a label, and we either currently have 0 or 2+ messages, // use a batch if we have a label, and we either currently have 2+ messages,
// or we are doing a Flush() and we have to assume that there will be more messages // or we are doing a Flush() and we have to assume that there will be more messages
// in the future. // in the future.
useBatch := useLabel && (len(rb.messages) != 1 || !final) startBatch := useLabel && (1 < len(rb.messages) || !final)
// if label but no batch, add label to first message if startBatch {
if useLabel && !useBatch && len(rb.messages) == 1 && rb.batchID == "" {
rb.messages[0].SetTag(caps.LabelTagName, rb.Label)
} else if useBatch {
rb.sendBatchStart(blocking) rb.sendBatchStart(blocking)
} else if useLabel && len(rb.messages) == 0 && rb.batchID == "" && final {
// ACK message
message := ircmsg.MakeMessage(nil, rb.session.client.server.name, "ACK")
message.SetTag(caps.LabelTagName, rb.Label)
rb.session.setTimeTag(&message, time.Time{})
rb.session.SendRawMessage(message, blocking)
} else if useLabel && len(rb.messages) == 1 && rb.batchID == "" && final {
// single labeled message
rb.messages[0].SetTag(caps.LabelTagName, rb.Label)
} }
// send each message out // send each message out
for _, message := range rb.messages { for _, message := range rb.messages {
// attach server-time if needed // attach server-time if needed
if rb.session.capabilities.Has(caps.ServerTime) && !message.HasTag("time") { rb.session.setTimeTag(&message, time.Time{})
message.SetTag("time", time.Now().UTC().Format(IRCv3TimestampFormat))
}
// attach batch ID, unless this message was part of a nested batch and is // attach batch ID, unless this message was part of a nested batch and is
// already tagged // already tagged