aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorB. Watson <urchlay@slackware.uk>2026-03-08 23:20:26 -0400
committerB. Watson <urchlay@slackware.uk>2026-03-08 23:20:26 -0400
commit05c066e18ac9ad909379634089813350841ce70e (patch)
tree0087991e2d7f6bd2bd95df6b6a89d667398a22fd /src
parentd19630bc7952a22acc11169be42f410e222fb904 (diff)
downloadfujinet-chat-05c066e18ac9ad909379634089813350841ce70e.tar.gz
fix start+a bug, add /ctcp command.
Diffstat (limited to 'src')
-rw-r--r--src/cmd.c60
-rw-r--r--src/irc.c1
2 files changed, 42 insertions, 19 deletions
diff --git a/src/cmd.c b/src/cmd.c
index bad5a28..5be0fd5 100644
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -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;
}
diff --git a/src/irc.c b/src/irc.c
index f5ac809..e0bf3b1 100644
--- a/src/irc.c
+++ b/src/irc.c
@@ -603,6 +603,7 @@ void switch_to_active() {
if(scr_status[i] == SCR_ACTIVE) {
scr_prev = scr_current;
scr_display(i);
+ return;
}
}
}