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:
commit
a5d09c932c
@ -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",
|
||||||
),
|
),
|
||||||
|
@ -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",
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user