aboutsummaryrefslogtreecommitdiff
path: root/src/cmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd.c')
-rw-r--r--src/cmd.c112
1 files changed, 94 insertions, 18 deletions
diff --git a/src/cmd.c b/src/cmd.c
index f4e94b6..ba66d2a 100644
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -12,13 +12,17 @@
char *command, *arg1, *arg2, *arg3;
static char *target;
+static void do_away(void);
+static void do_bell(void);
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);
static void do_list(void);
static void do_me(void);
static void do_msg(void);
+static void do_names(void);
static void do_part(void);
static void do_ping(void);
static void do_query(void);
@@ -37,7 +41,10 @@ typedef struct {
OP DEOP VOICE DEVOICE KICK BAN KB IGNORE UNIGNORE MODE
*/
cmd_t command_defs[] = {
+ { "AWAY", do_away, 1 },
+ { "BELL", do_bell, 1 },
{ "COLOR", do_color, 1 },
+ { "CTCP", do_ctcp, 1 },
{ "INFO", do_info, 0 },
{ "J", do_j, 1 },
{ "J1", do_j1, 1 },
@@ -47,6 +54,7 @@ cmd_t command_defs[] = {
{ "M", do_msg, 1 },
{ "ME", do_me, 1 },
{ "MSG", do_msg, 1 },
+ { "NAMES", do_names, 0 },
{ "PART", do_part, 0 },
{ "PING", do_ping, 0 },
{ "Q", do_query, 1 },
@@ -96,7 +104,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) {
@@ -104,12 +112,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
@@ -162,7 +164,7 @@ static void do_part(void) {
}
if(!target) {
- err_target_req();
+ err_no_scr_target();
return;
}
@@ -181,7 +183,7 @@ static void do_topic(void) {
}
if(!target) {
- err_target_req();
+ err_no_scr_target();
return;
}
@@ -191,6 +193,22 @@ static void do_topic(void) {
txbuf_send();
}
+static void do_names(void) {
+ if(arg1[0] == '#') {
+ target = arg1;
+ arg2 = nextarg(arg1);
+ } else {
+ arg2 = arg1;
+ }
+
+ if(!target) {
+ err_no_scr_target();
+ return;
+ }
+ txbuf_set_str2("NAMES ", target);
+ txbuf_send();
+}
+
static void do_server_info(void) {
txbuf_send_str("INFO");
}
@@ -199,27 +217,70 @@ 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();
}
+long read_rtclok(void) {
+ long r;
+
+ r = ((long)OS.rtclok[0] << 16);
+ r |= (OS.rtclok[1] << 8);
+ r |= OS.rtclok[2];
+
+ return r;
+}
+
+static void rtclok_to_numbuf(void) {
+ long r;
+ r = read_rtclok();
+ ltoa(r, numbuf, 10);
+}
+
+static void do_ctcp_ping(void) {
+ arg2 = "PING";
+ rtclok_to_numbuf();
+ arg3 = numbuf;
+ 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;
}
@@ -272,6 +333,10 @@ static void do_color(void) {
}
static void do_query(void) {
+ /* don't create a query if we already got one! */
+ if(scr_getbyname(arg1))
+ return;
+
if(scr_create(arg1, 1) == 0xff) {
err_marker();
scr_print_current("Can't create query, all screens in use\n");
@@ -300,6 +365,17 @@ static void do_msg(void) {
}
}
+static void do_away(void) {
+ OS.atract = 0x80;
+ irc_away = 1;
+ txbuf_set_str2("AWAY :", arg1);
+ txbuf_send();
+}
+
+static void do_bell(void) {
+ bell_type = *arg1 - '0';
+}
+
static int cmd_local(void) {
arg1 = nextarg(command);