diff options
Diffstat (limited to 'src/cmd.c')
| -rw-r--r-- | src/cmd.c | 60 |
1 files changed, 41 insertions, 19 deletions
@@ -13,6 +13,7 @@ char *command, *arg1, *arg2, *arg3; static char *target; static void do_color(void); +static void do_ctcp(void); static void do_info(void); static void do_j(void); static void do_j1(void); @@ -39,6 +40,7 @@ typedef struct { */ cmd_t command_defs[] = { { "COLOR", do_color, 1 }, + { "CTCP", do_ctcp, 1 }, { "INFO", do_info, 0 }, { "J", do_j, 1 }, { "J1", do_j1, 1 }, @@ -98,7 +100,7 @@ static void err_marker(void) { static void err_arg_req(void) { err_marker(); scr_print_current(cmd_def->cmd); - scr_print_current(" requires an argument\n"); + scr_print_current(": missing argument\n"); } static void err_no_scr_target(void) { @@ -106,12 +108,6 @@ static void err_no_scr_target(void) { scr_print_current("No channel/nick for screen\n"); } -static void err_target_req(void) { - err_marker(); - scr_print_current(cmd_def->cmd); - scr_print_current(" requires target channel/nick\n"); -} - /* arg points to something like: "part #channel I'm outta here\0" after nextarg(), arg points to "part\0" only, and ret points @@ -164,7 +160,7 @@ static void do_part(void) { } if(!target) { - err_target_req(); + err_no_scr_target(); return; } @@ -183,7 +179,7 @@ static void do_topic(void) { } if(!target) { - err_target_req(); + err_no_scr_target(); return; } @@ -202,7 +198,7 @@ static void do_names(void) { } if(!target) { - err_target_req(); + err_no_scr_target(); return; } txbuf_set_str2("NAMES ", target); @@ -217,27 +213,53 @@ static void do_server_ping(void) { txbuf_send_str("PING 0xdeadbeef"); } -static void do_ctcp_ping(void) { +/* arg1 = nick + arg2 = CTCP type + arg3 = optional data */ +static void send_ctcp(void) { txbuf_set_str3("PRIVMSG ", arg1, " :\x01"); - txbuf_append_str("PING 0xdeadbeef\x01"); + txbuf_append_str(arg2); + if(arg3) + txbuf_append_str2(" ", arg3); + txbuf_append_str("\x01"); txbuf_send(); } +static void do_ctcp_ping(void) { + arg2 = "PING"; + arg3 = "0xdeadbeef"; + send_ctcp(); +} + static void do_ctcp_info(void) { - txbuf_set_str3("PRIVMSG ", arg1, " :\x01"); - txbuf_append_str("CLIENTINFO\x01"); - txbuf_send(); + arg2 = "CLIENTINFO"; + arg3 = 0; + send_ctcp(); } static void do_ctcp_ver(void) { - txbuf_set_str3("PRIVMSG ", arg1, " :\x01"); - txbuf_append_str("VERSION\x01"); - txbuf_send(); + arg2 = "VERSION"; + arg3 = 0; + send_ctcp(); +} + +static void do_ctcp(void) { + if(!arg1) { + err_arg_req(); + return; + } + arg2 = nextarg(arg1); + if(!arg2) { + err_arg_req(); + return; + } + arg3 = nextarg(arg2); + send_ctcp(); } static void do_me(void) { if(!target) { - err_target_req(); + err_no_scr_target(); return; } |
