@@ -105,6 +105,10 @@ defmodule M51.IrcConn.Handler do
105
105
106
106
@ capabilities_ls Map . merge ( @ capabilities , @ informative_capabilities )
107
107
108
+ @ capability_names @ capabilities
109
+ |> Enum . map ( fn { name , { atom , _ } } -> { atom , name } end )
110
+ |> Map . new ( )
111
+
108
112
@ valid_batch_types [ "draft/multiline" ]
109
113
110
114
@ doc """
@@ -301,6 +305,22 @@ defmodule M51.IrcConn.Handler do
301
305
end
302
306
end
303
307
308
+ defp cap_ls ( is_302 , send ) do
309
+ caps = @ capabilities_ls
310
+ |> Map . to_list ( )
311
+ |> Enum . sort_by ( fn { k , _v } -> k end )
312
+ |> Enum . map ( fn { k , { _ , v } } ->
313
+ cond do
314
+ is_nil ( v ) -> k
315
+ ! is_302 -> k
316
+ true -> k <> "=" <> v
317
+ end
318
+ end )
319
+ |> Enum . join ( " " )
320
+
321
+ send . ( % M51.Irc.Command { source: "server." , command: "CAP" , params: [ "*" , "LS" , caps ] } )
322
+ end
323
+
304
324
# Handles a connection registration command, ie. only NICK/USER/CAP/AUTHENTICATE.
305
325
# Returns nil, {:nick, new_nick}, {:user, new_gecos}, {:authenticate, user_id},
306
326
# :got_cap_ls, or :got_cap_end.
@@ -341,30 +361,11 @@ defmodule M51.IrcConn.Handler do
341
361
nil
342
362
343
363
{ "CAP" , [ "LS" , "302" ] } ->
344
- caps =
345
- @ capabilities_ls
346
- |> Map . to_list ( )
347
- |> Enum . sort_by ( fn { k , _v } -> k end )
348
- |> Enum . map ( fn { k , { _ , v } } ->
349
- case v do
350
- nil -> k
351
- _ -> k <> "=" <> v
352
- end
353
- end )
354
- |> Enum . join ( " " )
355
-
356
- send . ( % M51.Irc.Command { source: "server." , command: "CAP" , params: [ "*" , "LS" , caps ] } )
364
+ cap_ls ( true , send )
357
365
:got_cap_ls
358
366
359
367
{ "CAP" , [ "LS" | _ ] } ->
360
- caps =
361
- @ capabilities_ls
362
- |> Map . to_list ( )
363
- |> Enum . sort_by ( fn { k , { _ , _v } } -> k end )
364
- |> Enum . map ( fn { k , _v } -> k end )
365
- |> Enum . join ( " " )
366
-
367
- send . ( % M51.Irc.Command { source: "server." , command: "CAP" , params: [ "*" , "LS" , caps ] } )
368
+ cap_ls ( false , send )
368
369
:got_cap_ls
369
370
370
371
{ "CAP" , [ "LIST" | _ ] } ->
@@ -789,11 +790,28 @@ defmodule M51.IrcConn.Handler do
789
790
{ "USER" , _ } ->
790
791
nil
791
792
793
+ { "CAP" , [ "LS" , "302" ] } ->
794
+ cap_ls ( true , send )
795
+
796
+ { "CAP" , [ "LS" | _ ] } ->
797
+ cap_ls ( false , send )
798
+
792
799
{ "CAP" , [ "LIST" | _ ] } ->
793
- send . ( % M51.Irc.Command { source: "server." , command: "CAP" , params: [ "*" , "LIST" , "sasl" ] } )
800
+ caps =
801
+ M51.IrcConn.State . capabilities ( state )
802
+ |> Enum . map ( fn cap -> @ capability_names [ cap ] end )
803
+ |> Enum . filter ( fn cap -> ! is_nil ( cap ) end )
804
+ |> Enum . join ( " " )
805
+
806
+ send . ( % M51.Irc.Command {
807
+ source: "server." ,
808
+ command: "CAP" ,
809
+ params: [ "*" , "LIST" , caps ]
810
+ } )
794
811
795
812
{ "CAP" , [ subcommand | _ ] } ->
796
813
# ERR_INVALIDCAPCMD
814
+ # TODO: support CAP REQ to turn caps on and off post-registration.
797
815
send_numeric . ( "410" , [ subcommand , "Invalid CAP subcommand" ] )
798
816
799
817
{ "CAP" , [ ] } ->
0 commit comments