|
@@ -301,28 +301,36 @@ func (msg *CapCommand) HandleRegServer(server *Server) {
|
301
|
301
|
switch msg.subCommand {
|
302
|
302
|
case CAP_LS:
|
303
|
303
|
client.capState = CapNegotiating
|
304
|
|
- client.Reply(fmt.Sprintf("CAP LS :%d", MultiPrefix))
|
|
304
|
+ client.Reply("CAP LS * :%s", SupportedCapabilities)
|
305
|
305
|
|
306
|
306
|
case CAP_LIST:
|
307
|
|
- client.Reply(fmt.Sprintf("CAP LIST :%s", client.capabilities))
|
|
307
|
+ client.Reply("CAP LIST * :%s", client.capabilities)
|
308
|
308
|
|
309
|
309
|
case CAP_REQ:
|
310
|
310
|
client.capState = CapNegotiating
|
311
|
|
- caps := msg.Capabilities()
|
312
|
|
- if (len(caps) != 1) && (caps[0] != MultiPrefix) {
|
313
|
|
- client.Reply("CAP NAK :" + msg.args[0])
|
314
|
|
- return
|
|
311
|
+ for capability := range msg.capabilities {
|
|
312
|
+ if !SupportedCapabilities[capability] {
|
|
313
|
+ client.Reply("CAP NAK * :%s", msg.capabilities)
|
|
314
|
+ return
|
|
315
|
+ }
|
315
|
316
|
}
|
316
|
|
- for _, capability := range caps {
|
|
317
|
+ for capability := range msg.capabilities {
|
317
|
318
|
client.capabilities[capability] = true
|
318
|
319
|
}
|
319
|
|
- client.Reply("CAP ACK :" + msg.args[0])
|
|
320
|
+ client.Reply("CAP ACK * :%s", msg.capabilities)
|
320
|
321
|
|
321
|
322
|
case CAP_CLEAR:
|
|
323
|
+ format := strings.TrimRight(
|
|
324
|
+ strings.Repeat("%s%s ", len(client.capabilities)), " ")
|
|
325
|
+ args := make([]interface{}, len(client.capabilities))
|
|
326
|
+ index := 0
|
322
|
327
|
for capability := range client.capabilities {
|
|
328
|
+ args[index] = Disable
|
|
329
|
+ args[index+1] = capability
|
|
330
|
+ index += 2
|
323
|
331
|
delete(client.capabilities, capability)
|
324
|
332
|
}
|
325
|
|
- client.Reply("CAP ACK :")
|
|
333
|
+ client.Reply("CAP ACK * :"+format, args...)
|
326
|
334
|
|
327
|
335
|
case CAP_END:
|
328
|
336
|
client.capState = CapNegotiated
|